我需要替换多个文件中的一行,并且一直在使用 sed 寻求解决方案。我遇到这个错误:
sed:-e 表达式 #1,字符 31:未终止的“s”命令
当尝试运行包含以下行的 bash 脚本时:
sed -i.bak "s/some-text-string/some-text-string ${stringVar}/" *.ext
我知道这是可能导致此问题的空白,但我无法在任何地方找到解决方案。我需要保留替换中的空格。我已经考虑过附加字符串,但使用其他函数也未能取得很大进展。
我可能错误地处理了这个问题,觉得我应该使用不同的函数,但是我没有大量的 sed 或 bash 经验,并且遇到了困难。
如果有人能够阐明可能的解决方案,我们将不胜感激。
答案1
空格或制表符应该不会引起问题,但换行符可能会破坏 sed 命令。问题是 shell 变量不是您从其他编程语言中可能知道的真正变量,它们更类似于宏。
切换到具有真实变量的真实编程语言可以解决这个问题。例如,为了保持语法相似,Perl 解决方案:
r=$stringVar perl -i.bak -pe 's/some-text-string/some-text-string$ENV{r}/' -- *.ext
通过预先给命令赋值,变量就成为命令运行环境的一部分。