如何在sed中逃脱单引号?

时间:2014-07-01 11:31:40

标签: sed escaping quote

如何在已被引号括起的sed表达式中转义单引号?

例如:

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

9 个答案:

答案 0 :(得分:108)

使用双引号引用sed代码:

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

我不喜欢用数百个反斜杠逃避代码 - 伤害了我的眼睛。通常我这样做:

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

答案 1 :(得分:28)

一个技巧是使用相邻字符串的shell字符串连接并使用shell转义来转义嵌入的引用:

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

two's thing

sed表达式中有3个字符串,然后shell将它们拼接在一起:

sed 's/ones/two'

\'

's/'

希望能帮到别人!

答案 2 :(得分:6)

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

例如:

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

答案 3 :(得分:3)

只需在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

答案 4 :(得分:1)

这有点荒谬,但是我无法在\'中使用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/'

我不知道为什么\'本身不能工作,但确实可以。

答案 5 :(得分:1)

中转义单引号:3 种不同的方式:

从脆弱到坚固...

1.使用双引号将 sed 脚本括起来:

最简单的方法:

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

但使用双引号会导致 shell 变量扩展和反斜杠在运行 sed 之前被认为是 shell 转义。

1.1.没有空格或特殊字符的特定情况

在这种特定情况下,您可以避免在 shell 级别进行封闭:

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

将一直工作到整个 sedscript 不包含空格、分号、特殊字符等......(脆弱!)

2.使用八进制十六进制表示:

这种方式既简单又高效,但可读性不如下一种。

sed 's/ones/one\o047s/' <<< 'ones thing'

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

由于后面的字符 (s) 不是数字,所以你可以只用 2 位数字来写八进制:

sed 's/ones/one\o47s/' <<< 'ones thing'

3.创建专用的 sed 脚本

首先确保sed工具的正确路径:

which sed
/bin/sed

然后调整shebang如下:

cat <<"eosedscript" >sampleSedWithQuotes.sed
#!/bin/sed -f

s/ones/one's/;
eosedscript
chmod +x sampleSedWithQuotes.sed

从那里,你可以运行:

./sampleSedWithQuotes.sed <<<'ones thing'
one's thing

这是最强大和最简单的解决方案,因为您的脚本最易读:cat sampleSedWithQuotes.sed

#!/bin/sed -f

s/ones/one's/;

答案 6 :(得分:0)

我知道这听起来像是一个警察,但是当字符串中有单引号和双引号时,我永远无法使用sed。为了帮助像我这样有困难的任何新手,一个选择是分割字符串。我不得不替换100多个index.hmtl文件中的代码。字符串有单引号和双引号,所以我只是拆分字符串并用第一个块替换 <!---->的第二个区块。它使我的index.html文件搞得一团糟,但它确实有效。

答案 7 :(得分:0)

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

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

答案 8 :(得分:0)

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

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

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

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

都返回

one's thing