使用Sed将字符串变量替换为字符串变量
使用Sed将字符串变量替换为字符串变量
我有一个名为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
问题出现的原因是因为变量${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
感谢你复制了这个脚本,但是它只会在终端中回显新变量的内容,而不会修改文件ethernet
。我做错了什么?
并不是说你做错了,只是普通的Awk不支持内联编辑。如果你有Gawk,可以尝试添加--inline
选项。如果没有,可以将结果保存在临时文件中,然后将其移动到原始文件上。
好的,如果我使用gawk,命令应该是什么样的?如果gawk不起作用,有没有一种方法可以删除该行?
同样的命令在gawk上也可以运行(实际上我也在gawk上测试过)。
我想你是指原地编辑和-i inplace
,这在Gawk v4.1+中可用。
哦,是的,非常抱歉给你带来了困惑。
问题出现的原因是需要将一个字符串变量中的特殊字符转义,以便在使用sed命令时不会被识别为正则表达式的特殊字符。解决方法是使用sed命令将特殊字符转义。
在上述代码中,使用了sed命令对字符串变量old_line
进行转义,并将转义后的结果赋值给old_line
。具体的转义操作是将old_line
中的特殊字符[]$.*[\^]
替换为\\&
,这样就实现了对特殊字符的转义。
接下来的一行代码使用sed命令将old_line
替换为new_line
,并将替换结果应用到文件ethernet
中。
通过以上操作,成功实现了对字符串变量中特殊字符的转义,从而解决了问题。
对于更一般的情况,除了上述特殊字符外,还需要对/
、\
和&
进行转义处理。