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

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

SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="2r:11:89:89:9g:ah", ATTR{dev_id}=="0x0", ATTR{type}=="1", KERNEL=="eth*", NAME="eth1"

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

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

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

【问题讨论】:

标签: regex linux bash sed


【解决方案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+ 中可用
  • 哦,确实如此,很抱歉造成混乱。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-09-28
  • 1970-01-01
  • 1970-01-01
  • 2020-07-09
  • 2021-07-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多