首页 > 解决方案 > 如何使用 sed 将字符串替换为变量字符串?

问题描述

我正在尝试以下命令

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

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

标签: sed

解决方案


sed不幸的是,这是标准化程度不高的角落之一。某些变体绝对需要用反斜杠转义换行符;其他人会将转义的换行符视为应在处理之前删除的内容。

作为一般经验法则,在sed脚本周围使用单引号,以防止 shell 在sed启动之前也修改参数。 但是,这意味着$new_line不会对 的值进行插值。一个常见的解决方法是我所说的“跷跷板式报价”;将大部分脚本放在单引号中,但在需要 shell 插入变量的地方切换到双引号。

sed -i 's/# My name is Eric Johnson/c\'"${new_line}/" file

请注意如何"foo"'bar' = "foobar" = 'foobar' = foobar(只要字符串不包含任何 shell 元字符,即使不带引号的标记也可以,尽管通常不建议这样做)。

另外,

new_line=My name is Eric Johnson

对于这种情况是不正确的;它将分配new_line=My然后运行name is Eric Johnson带有此变量分配的命令行。当命令完成时(或者,在我的计算机上,shell 报告name: command not found的值new_line恢复到以前的状态(如果未定义,则未定义,或者恢复到以前的值)。


推荐阅读