为什么我无法在sed替换中转义单引号但使用\ x27起作用?

Moh*_*med 1 unix linux bash shell sed

我正在尝试用4个单引号引起来,但是转义由于某种我不知道的原因而无法正常工作!

这是我不工作的命令:

sed -r 's/\*\*(.*)\*\*/\'\'\1\'\'/' file
Run Code Online (Sandbox Code Playgroud)

我不知道为什么连引号都输出错误。

我知道我可以使用双引号解决问题,例如:

sed -r "s/\*\*(.*)\*\*/\'\'\1\'\'/"
Run Code Online (Sandbox Code Playgroud)

要么:

sed -r 's/\*\*(.*)\*\*/\x27\x27\1\x27\x27/'
Run Code Online (Sandbox Code Playgroud)

但是是的,我只想知道第一种形式不起作用的原因。谢谢

hek*_*mgl 5

首先,使用\x27imo是正确且最易读的方法。

关于您的问题,问题与bash的单引号字符串有关。您不能在单个带引号的字符串中转义单个引号。从bash手册

3.1.2.2单引号

将字符括在单引号(''')中可保留引号内每个字符的字面值。即使在单引号之前加反斜杠,也不能在单引号之间引起单引号。

这意味着这并不能正常工作:

echo 'ab\'c'
Run Code Online (Sandbox Code Playgroud)

您需要结束带引号的字符串,添加转义的引号,然后再次启动单引号的字符串:

echo 'ab'\''c'
Run Code Online (Sandbox Code Playgroud)