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)
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/'
希望能帮助别人!
F. *_*uri 15
从脆弱到坚固...
注意:这个答案是基于GNUsed的!
最简单的方法:
sed "s/ones/one's/" <<< 'ones thing'
Run Code Online (Sandbox Code Playgroud)
但使用双引号会导致 shell 变量扩展,并且反斜杠会在运行前sed被视为 shell 转义。
在这种特定情况下,您可以避免在 shell 级别(命令行)进行封闭:
sed s/ones/one\'s/ <<<'ones thing'
Run Code Online (Sandbox Code Playgroud)
将一直工作,直到整个 sedscript 不包含空格、分号、特殊字符等...(脆弱!)
这种方式简单高效,尽管不如下一种方式可读。
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)
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)
-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)
使用专用脚本可以简化同一脚本中的混合引号和双引号。
在我们的脚本中添加一个新操作,将单词thing用双引号引起来:
sed 's/ones/one\o47s/' <<< 'ones thing'
Run Code Online (Sandbox Code Playgroud)
(现在我们的脚本看起来像:
Run Code Online (Sandbox Code Playgroud)#!/bin/sed -f s/ones/one's/; s/\bthing\b/"&"/;)
然后
./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)
最好的方法是使用 $'some string with \' quotes \''
例如:
sed $'s/ones/two\'s/' <<< 'ones thing'
Run Code Online (Sandbox Code Playgroud)