我有这样的代码:
sed "s/TEST_CASES_R/$testCaseLocations/g" template >> newfile
其中$testCaseLocations
有,tests/test/,tests/test/2
。所以这一行失败了:
替换命令中的错误标志
我该如何解决这个问题?
答案 0 :(得分:3)
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