Regex 使用Sed将字符串变量替换为字符串变量

Regex 使用Sed将字符串变量替换为字符串变量,regex,linux,bash,sed,Regex,Linux,Bash,Sed,我有一个名为ethernet的文件,包含多行。我已将其中一行保存为名为old\u 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_uline的变量,类似于old溳行,但在文本

我有一个名为ethernet的文件,包含多行。我已将其中一行保存为名为old\u 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_uline的变量,类似于old溳行,但在文本中做了一些修改

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

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

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

使用此
awk
命令代替使用无正则表达式的命令:

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

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

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

尝试不使用{}环绕变量吗?也请检查谢谢,但不幸的是,这也不起作用。谢谢,我复制了脚本,但它只回显了终端中新变量的变量内容。它不会修改文件。我做错了什么?这本身并不是“错”,只是简单的jane Awk不支持内联编辑。如果您有Gawk,请尝试添加
--inline
选项。如果没有,则存储在临时文件中,并将其移动到原始文件的顶部。同样的命令也适用于gawk(事实上,我也在gawk上测试过它)@tripleee:我想你的意思是就地编辑和
-I inplace
,在gawk v4.1+中提供。哦,是的,很抱歉混淆了。是的,这完全成功了!我非常感谢PatJ!!对于更一般的情况,应将“/”转义为新行变量中的“\”和“&”。