如何在sed中逃避单引号?

Tho*_*att 72 escaping sed quote

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

例如:

sed 's/ones/one's/' <<< 'ones thing'
Run Code Online (Sandbox Code Playgroud)

Ken*_*ent 127

引号sed用双引号:

    $ sed "s/ones/one's/"<<<"ones thing"   
    one's thing
Run Code Online (Sandbox Code Playgroud)

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

    $ sed 's/ones/one\x27s/'<<<"ones thing"
    one's thing
Run Code Online (Sandbox Code Playgroud)

  • 应该注意的是,用双引号引起来的 sed 命令允许 shell 插入这些命令,并可能导致不可预见的问题。 (3认同)
  • 这导致了我一直在寻找的答案,最终是:`echo“one's thing”| sed 's/\x27/\\'"'"'/g'` &gt;&gt; `$ one\'s thing` (3认同)
  • 这似乎不适用于`sed -i`,有任何特殊原因吗? (2认同)

Tho*_*att 32

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

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

two's thing
Run Code Online (Sandbox Code Playgroud)

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

sed 's/ones/two'

\'

's/'

希望能帮助别人!

  • @gregory: `sed 's/ones/two''s/' &lt;&lt;&lt; 'ones thing'` 不,输出的是 `twos thing`。输出中缺少“”。您必须按照此答案中描述的方式进行操作。 (3认同)

F. *_*uri 15

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

从脆弱到坚固...

注意:这个答案是基于GNUsed的!

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

最简单的方法:

sed "s/ones/one's/" <<< 'ones thing'
Run Code Online (Sandbox Code Playgroud)

但使用双引号会导致 shell 变量扩展,并且反斜杠会在运行sed被视为 shell 转义。

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

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

sed s/ones/one\'s/ <<<'ones thing'
Run Code Online (Sandbox Code Playgroud)

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

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

这种方式简单高效,尽管不如下一种方式可读。

sed s/ones/one\'s/ <<<'ones thing'
Run Code Online (Sandbox Code Playgroud)

由于下面的字符 ( s) 不是数字,因此可以只写 2 位数字的八进制:

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

sed 's/ones/one\x27s/' <<< 'ones thing'
Run Code Online (Sandbox Code Playgroud)

3.创建专用的sed脚本

cat <<eosedscript >sampleSedWithQuotes.sed
#!$(which sed) -f

s/ones/one's/;
eosedscript
chmod +x sampleSedWithQuotes.sed
Run Code Online (Sandbox Code Playgroud)

从那里,你可以运行:

./sampleSedWithQuotes.sed <<<'ones thing'
one's thing
Run Code Online (Sandbox Code Playgroud)

这是最强大、最简单的解决方案,因为您的脚本最具可读性:
$ cat sampleSedWithQuotes.sed

#!/bin/sed -f

s/ones/one's/;
Run Code Online (Sandbox Code Playgroud)

3.1 你可以使用-ised 标志:

由于此脚本在 shebang 中使用,您可以在命令行上sed使用标志。对于就地sed编辑,使用标志:file.txt -i

echo >file.txt 'ones thing'
./sampleSedWithQuotes.sed -i file.txt
cat file.txt
one's thing
Run Code Online (Sandbox Code Playgroud)

3.2 混合引号和双引号

使用专用脚本可以简化同一脚本中的混合引号和双引号。

在我们的脚本中添加一个新操作,将单词thing用双引号引起来:

sed 's/ones/one\o47s/' <<< 'ones thing'
Run Code Online (Sandbox Code Playgroud)

(现在我们的脚本看起来像:

 #!/bin/sed -f
 
 s/ones/one's/;
 s/\bthing\b/"&"/;
Run Code Online (Sandbox Code Playgroud)

然后

./sampleSedWithQuotes.sed <<<'ones thing'
one's "thing"
Run Code Online (Sandbox Code Playgroud)


小智 7

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

$ sed "s/ones/one's/" <<< 'ones thing'
one's thing
Run Code Online (Sandbox Code Playgroud)

它也适用于文件。

$ echo 'ones thing' > testfile
$ sed -i "s/ones/one's/" testfile
$ cat testfile
one's thing
Run Code Online (Sandbox Code Playgroud)

如果字符串中有单引号双引号,那也没关系。只需转义双引号。

例如,此文件包含一个带有单引号和双引号的字符串。我将使用 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
Run Code Online (Sandbox Code Playgroud)


Joh*_*n C 6

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

例如:

sed $'s/ones/two\'s/' <<< 'ones thing'
Run Code Online (Sandbox Code Playgroud)

  • C风格的`$'string'`是特定于Bash的,所以它不能移植到POSIX shell. (3认同)