我正在尝试从 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