我正在尝试以下命令
new_line=My name is Eric Johnson
sed -i '/# My name is Eric/c\'"${new_line}" /tmp/foo"
Bash在sed命令中将上面的new_line视为一个文件,并说没有此类文件。在sed命令中使用变量将整行替换为新行的正确方法是什么。
答案 0 :(得分:1)
不幸的是,这是sed
的那些角落之一,标准化程度不高。有些变体将绝对要求换行符以反斜杠转义;其他人会将转义的换行符视为应在处理之前删除的内容。
作为一般经验法则,请在sed
脚本周围使用单引号,以防止shell甚至在sed
开始之前也修改自变量。 但是,表示$new_line
的值不会被插值。常见的解决方法是我所说的“跷跷板报价”。将脚本的大部分内容置于单引号中,但在需要外壳插入变量的地方切换到双引号。
sed -i 's/# My name is Eric Johnson/c\'"${new_line}/" file
注意"foo"'bar' = "foobar" = 'foobar' = foobar
的方式(只要字符串不包含任何外壳元字符,即使未引用的令牌也可以,尽管通常不建议这样做)。
更进一步,
new_line=My name is Eric Johnson
在这种情况下不正确;它将分配new_line=My
,然后在适当位置分配此变量的情况下运行命令行name is Eric Johnson
。命令完成后(或在我的计算机上,shell报告name: command not found
的值new_line
已还原为以前的状态(如果未定义则为未定义,或者返回其先前的值)