如何在 sed 中转义单引号?

如何在已经被引号包围的 sed 表达式中转义单引号?

例如:

sed 's/ones/one's/' <<< 'ones thing'
124031 次浏览

One trick is to use shell string concatenation of adjacent strings and escape the embedded quote using shell escaping:

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

two's thing

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

sed 's/ones/two'

\'

's/'

希望能帮到别人!

The best way is to use $'some string with \' quotes \''

例如:

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

双引号 sed码:

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

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

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

我知道这听起来像是在逃避,但是当字符串中有单引号和双引号时,我永远不可能让 sed 工作。为了帮助像我这样有困难的新手,一个选择是分开字符串。我必须替换超过100个 index.hmtl 文件中的代码。字符串同时有单引号和双引号,所以我只是将字符串分开,并将第一个块替换为 <!-- and the second block with -->. It made a mess of my index.html files but it worked.

只需在 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 's/ones/one\'s/'\'工作。我正在寻找这使一个外壳脚本,将自动添加 import 'hammerjs';到我的 src/main.ts文件与角度。

我的工作是这样的:

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

So for the example above, it would be:

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

我不知道为什么 \'不能自己工作,但它就在那里。

苹果 MacOSX 终端上的一些逃脱失败了:

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

use an alternative string seperator like ":" to avoid confusion with different slashes

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

or if you wish to highligh the single quote

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

都回来了

one's thing

中逃避单引号: 3种不同的方式:

从脆弱到坚固。

1. 用双引号括起 Sed 脚本:

最简单的方法:

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

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

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)不是数字,你可以只用两个数字写八进制:

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

这是最强大和最简单的解决方案,因为您的脚本是 最多可读的: < br/> $ cat sampleSedWithQuotes.sed

#!/bin/sed -f


s/ones/one's/;

3.1你可以使用 -i标志:

因为这个 剧本在 shebang 中使用 sed,所以您可以在命令行上使用 sed标志。编辑 file.txt 到位,使用 -i标志:

echo >file.txt 'ones thing'
./sampleSedWithQuotes.sed -i file.txt
cat file.txt
one's thing