使用 Sed 将字符串变量替换为字符串变量 [重复]

Posted

技术标签:

【中文标题】使用 Sed 将字符串变量替换为字符串变量 [重复]【英文标题】:Replace string variable with string variable using Sed [duplicate] 【发布时间】:2015-04-18 02:10:34 【问题描述】:

我有一个名为 ethernet 的文件,其中包含多行。我已将其中一行保存为名为 old_line 的变量。该变量的内容如下所示:

SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTRaddress=="2r:11:89:89:9g:ah", ATTRdev_id=="0x0", ATTRtype=="1", KERNEL=="eth*", NAME="eth1"

我创建了第二个变量,名为 new_line,它类似于 old_line,但在文本中做了一些修改。

我想使用 sed 将 old_line 的内容替换为 new_line 的内容。到目前为止,我有以下内容,但它不起作用:

sed -i "s/$old_line/$new_line/g" ethernet

【问题讨论】:

尝试不使用 围绕变量?还要检查***.com/questions/8938571/… 谢谢,但不幸的是这也不起作用。 【参考方案1】:

您需要转义您的 oldline 以便它不包含正则表达式特殊字符,幸运的是这可以使用 sed 完成。

old_line=$(echo "$old_line" | sed -e 's/[]$.*[\^]/\\&/g' )
sed -i -e "s/$old_line/$new_line/g" ethernet

【讨论】:

是的,这完全成功了!非常感谢PatJ!! 对于更一般的情况,只要 new_line 变量中的“\”和“&”,“/”也应该被转义。【参考方案2】:

由于$old_line 包含许多正则表达式特殊元字符,例如*? 等,因此您的sed 失败。

使用这个awk 命令代替使用no regex

awk -v old="$old_line" -v new="$new_line" 'p=index($0, old) 
      print substr($0, 1, p-1) new substr($0, p+length(old)) ' ethernet

【讨论】:

谢谢,我复制了脚本,但它只在我的终端中回显新变量的变量内容。它不会修改文件 ethernet。我做错了什么? 这本身并没有“错误”,只是plain-jane Awk 不支持内联编辑。如果您有 Gawk,请尝试添加 --inline 选项。如果没有,请将其存储在临时文件中并将其移动到原始文件的顶部。 同样的命令也可以在 gawk 上运行(其实我也在 gawk 上测试过) @tripleee:我认为您的意思是就地编辑和-i inplace,在 Gawk v4.1+ 中可用 哦,确实如此,很抱歉造成混乱。

以上是关于使用 Sed 将字符串变量替换为字符串变量 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

Sed:如果其中不包含chaine,则替换字符串[重复]

Sed用shell变量替换[重复]

shell脚本之sed使用----替换变量转义字符

转载:shell脚本之sed使用----替换变量转义字符

sed替换字符串(变量)

如何使用 sed 或 awk 命令用变量(变量保存 Unix 脚本)查找和替换文本