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

时间:2015-01-27 13:43:19

标签: bash shell sed

我有这样的代码:

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

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

  

替换命令中的错误标志

我该如何解决这个问题?

2 个答案:

答案 0 :(得分:3)

啊,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有意义的字符,例如{{1},那么您就会遇到麻烦}或\

答案 1 :(得分:2)

只需为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