用特殊字符替换sed中的字符串内容

Replace the string content in sed with special chars

我有这样的代码:

sed "s/TEST_CASES_R/$testCaseLocations/g" template >> newfile

其中 $testCaseLocations,tests/test/,tests/test/2。所以这条线失败了:

bad flag in substitute command

我该如何解决这个问题?

只需为 sed 使用另一个分隔符,否则它会看到周围有很多斜杠:sed 's#hello#bye#g' 没问题。

你的情况:

sed "s#TEST_CASES_R#$testCaseLocations#g" template >> newfile

查看另一个测试:

$ var="/hello"
$ echo "test" | sed "s/test/$var/g"
sed: -e expression #1, char 9: unknown option to `s'
$ echo "test" | sed "s#test#$var#g"
/hello

啊,sed 代码注入。 sed 看到的是

sed "s/TEST_CASES_R/,tests/test/,tests/test/2/g" template >> newfile

...这是荒谬的。根本问题是 sed 无法区分您希望它视为数据的内容——$testCaseLocations 的内容——和指令。

我认为最好的解决方案是使用 awk:

awk -v replacement="$testCaseLocations" '{ gsub(/TEST_CASES_R/, replacement); print }' template >> newfile

因为这通过不将 testCaseLocations 视为代码来巧妙地回避代码注入问题。在这种特殊情况下,您还可以为 sed 使用不同的定界符,例如

 sed "s@TEST_CASES_R@$testCaseLocations@g" template >> newfile

但是如果 $testCaseLocations 包含一个 @,或者如果它包含一个在它出现的上下文中对 sed 有意义的字符,那么你 运行 就会遇到麻烦,比如作为 \&.