如何在sed中转义单引号?


Answers:


149

sed带双引号的报价代码:

    $ sed "s/ones/one's/"<<<"ones thing"   
    one's thing

我不喜欢用数百个反斜杠来转义代码,这很伤我的眼睛。通常我是这样做的:

    $ sed 's/ones/one\x27s/'<<<"ones thing"
    one's thing

7
这似乎不适用于sed -i任何特定原因?
SamAko '16

应当注意,用双引号引起来的sed命令允许外壳插入这些命令,并可能导致无法预料的问题。
potong

38

一种技巧是使用相邻字符串的外壳程序字符串串联,并使用外壳程序转义对嵌入式引号进行转义:

sed 's/ones/two'\''s/' <<< 'ones thing'

two's thing

sed表达式中有3个字符串,然后外壳将它们缝合在一起:

sed 's/ones/two'

\'

's/'

希望对别人有帮助!


也许是一个更简单的变体:sed's / ones / two's /'<<<'ones
something'– gregory

@gregory:sed 's/ones/two''s/' <<< 'ones thing'不,输出twos thing'在输出中缺少。您必须按照此答案中所述的方法进行操作。
威斯巴基

@wisbucky对于我在zsh上使用(FreeBSD / macOS)的sed版本,它肯定会输出“两件事情”。
格雷戈里

让我知道这对您有很大的帮助,然后将外壳缝合在一起。
Prateek Gupta,

6

最好的方法是使用 $'some string with \' quotes \''

例如:

sed $'s/ones/two\'s/' <<< 'ones thing'

3
C风格$'string'是特定于Bash的,因此它不能移植到POSIX shell中。
Tripleee 2013年

没有bash具体说明。它也可以在ksh和中使用zsh,但是可以,它是POSIX的扩展,如果您不编写可移植的脚本,这很好。唯一的缺点是您还必须转义使用其他反斜杠。
dannyw

6

只需在sed命令的外部使用双引号即可。

$ sed "s/ones/one's/" <<< 'ones thing'
one's thing

它也适用于文件。

$ echo 'ones thing' > testfile
$ sed -i "s/ones/one's/" testfile
$ cat testfile
one's thing

如果字符串中有单引号双引号,也可以。只是转义双引号。

例如,此文件包含带单引号和双引号的字符串。我将使用sed添加单引号并删除一些双引号。

$ cat testfile
"it's more than ones thing"
$ sed -i "s/\"it's more than ones thing\"/it's more than one's thing/" testfile 
$ cat testfile 
it's more than one's thing

谢谢!我爱正则表达式,爱sed,现在我爱你<3
Gabriel A. Zorrilla

3

这是一种荒谬的,但我无法得到\'sed 's/ones/one\'s/'工作。我一直在寻找一个shell脚本,它将通过Angular自动添加import 'hammerjs';到我的src/main.ts文件中。

我上班的确是这样的:

apost=\'
sed -i '' '/environments/a\
import '$apost'hammerjs'$apost';' src/main.ts

因此,对于上面的示例,它将是:

apost=\'
sed 's/ones/one'$apost's/'

我不知道为什么\'不能单独工作,但是确实存在。



0

我知道这听起来像个警察,但是当字符串中同时包含单引号和双引号时,我永远无法工作。为了帮助像我这样遇到麻烦的新手,一种选择是拆分字符串。我不得不替换100多个index.hmtl文件中的代码。字符串具有单引号和双引号,因此我只是将字符串分开,并用替换了第一个块,<!--并用替换 了第二个块-->。它弄乱了我的index.html文件,但可以正常工作。


0

AppleMacOSX终端上的某些转义失败,因此:

sed 's|ones|one'$(echo -e "\x27")'s|1' <<<'ones thing'


0

使用替代字符串分隔符,例如“:”,以避免与不同的斜杠混淆

sed "s:ones:one's:" <<< 'ones thing'

或者,如果您希望高亮单引号

sed "s:ones:one\'s:" <<< 'ones thing'

都回来了

one's thing
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.