带有 ' 特殊字符的 Sed 命令

带有 ' 特殊字符的 Sed 命令

我正在尝试从 bash shell 执行以下命令:

sed -i "s/\(update.*\)where /\1 where primary_id = '$primary_id', /" *.php

如您所见,我使用 sed 插入一个变量 - 即'$primary_id'。执行命令后,我看到'显示了 ,但$primary_id丢失了。

如何处理特殊字符,例如 '

答案1

让我们把这个变得简单一点。您希望将每次出现的 替换a'$b'(美元,ab 用单引号引起来)。c,变量$b发生的扩展,不是你想要的。

b=c
sed -i "s/a/'$b'/g" *.php

上面的命令与您在问题中所做的类似。由于字符串s/a/'$b'/g用双引号括起来,因此变量被扩展,替换字符串为'c'

如果整个sed命令用双引号括起来,则需要转义$。这是一种解决方案:

sed -i "s/a/'\$b'/g" *.php\

另一种可能性是不引用任何内容,除了对 shell 有特殊含义的任何字符(不推荐,但可能很有洞察力):

sed -i s/a/\'\$b\'/g *.php

答案2

除非我误解,否则您的命令完全按照预期工作:

$ cat test_file 
update name where a='b'
$ export primary_id="test"
$ sed -i "s/\(update.*\)where /\1 where primary_id = '$primary_id', /" test_file
$ cat test_file 
update name  where primary_id = 'test', a='b'

答案3

前面带有\s 的特殊字符将按字面意思处理。
(就像您对括号所做的那样:( \( \)))。

它应该看起来像这样:\'
如果您发现仍然不起作用,请尝试:'\''
或者,尝试使用十六进制转义序列:\x27

另外,关于sed:将您的表达式括起来:
单身的 引号( 's/1/2/g')。 不是 双打 ( "s/1/2/g")


sed -i 's/\(update.\*\)where /\1 where primary_id = \'$primary_id\', /' \*.php  

sed -i 's/\(update.\*\)where /\1 where primary_id = '\''$primary_id'\'', /' \*.php

sed -i 's/\(update.\*\)where /\1 where primary_id = \x27$primary_id\x27, /' \*.php

相关内容