我如何使用sed将字符串替换为可变字符串?

时间:2018-08-24 00:57:19

标签: sed

我正在尝试以下命令

new_line=My name is Eric Johnson
sed -i '/# My name is Eric/c\'"${new_line}" /tmp/foo"

Bash在sed命令中将上面的new_line视为一个文件,并说没有此类文件。在sed命令中使用变量将整行替换为新行的正确方法是什么。

1 个答案:

答案 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已还原为以前的状态(如果未定义则为未定义,或者返回其先前的值)