使用 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 将字符串变量替换为字符串变量 [重复]的主要内容,如果未能解决你的问题,请参考以下文章