如何在已经被引号包围的 sed 表达式中转义单引号?
例如:
sed 's/ones/one's/' <<< 'ones thing'
用双引号引用 sed
代码:
$ sed "s/ones/one's/"<<<"ones thing"
one's thing
我不喜欢用数百个反斜杠转义代码——伤害我的眼睛。通常我这样做:
$ sed 's/ones/one\x27s/'<<<"ones thing"
one's thing
一个技巧是使用相邻字符串的 shell 字符串连接,并使用 shell 转义来转义嵌入的引号:
sed 's/ones/two'\''s/' <<< 'ones thing'
two's thing
sed 表达式中有 3 个字符串,然后 shell 将它们缝合在一起:
sed 's/ones/two'
\'
's/'
希望对其他人有所帮助!
sed 's/ones/two''s/' <<< 'ones thing'
不,输出 twos thing
。它在输出中缺少 '
。您必须按照此答案中描述的方式进行操作。
最好的方法是使用 $'some string with \' quotes \''
例如:
sed $'s/ones/two\'s/' <<< 'ones thing'
$'string'
是特定于 Bash 的,因此它不能移植到 POSIX shell。
bash
特定的。它在 ksh
和 zsh
中也可用,但是是的,它是 POSIX 的扩展,如果您不编写可移植脚本,这很好。唯一的缺点是您还必须转义您使用的任何其他反斜杠。
只需在 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 种不同的方式:
从脆弱到坚固...
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/;
3.1 你可以使用 -i sed 标志:
由于此 脚本 在 shebang 中使用 sed
,因此您可以在命令行上使用 sed
标志。使用 -i
标志编辑file.txt
就地:
echo >file.txt 'ones thing'
./sampleSedWithQuotes.sed -i file.txt
cat file.txt
one's thing
sed
?
这有点荒谬,但我无法让 sed 's/ones/one\'s/'
中的 \'
工作。我正在查找这个以制作一个 shell 脚本,该脚本会自动将 import 'hammerjs';
添加到我的 src/main.ts
文件中。
我所做的工作是这样的:
apost=\'
sed -i '' '/environments/a\
import '$apost'hammerjs'$apost';' src/main.ts
因此,对于上面的示例,它将是:
apost=\'
sed 's/ones/one'$apost's/'
我不知道为什么 \'
不能单独工作,但它确实存在。
AppleMacOSX 终端上的一些转义失败,因此:
sed 's|ones|one'$(echo -e "\x27")'s|1' <<<'ones thing'
我知道这听起来像是一个警察,但是当字符串中同时存在单引号和双引号时,我永远无法让 sed 工作。为了帮助像我这样遇到麻烦的新手,一种选择是拆分字符串。我不得不替换 100 多个 index.hmtl 文件中的代码。字符串既有单引号也有双引号,所以我只是拆分字符串并将第一个块替换为 <!--
,将第二个块替换为 -->
。它弄乱了我的 index.html 文件,但它起作用了。
使用替代字符串分隔符,如“:”,以避免与不同的斜杠混淆
sed "s:ones:one's:" <<< 'ones thing'
或者如果您想突出显示单引号
sed "s:ones:one\'s:" <<< 'ones thing'
两者都返回
one's thing
不定期副业成功案例分享
sed -i
,有什么特别的原因吗?echo "one's thing" | sed 's/\x27/\\'"'"'/g'
>>$ one\'s thing
sed -i
是一个红鲱鱼。并非所有sed
方言都接受像\x27
这样的十六进制代码,无论您是否传入-i
标志。echo "one's thing" | sed 's/\x27/\\&/g'