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

13 浏览
0 Comments

使用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

0
0 Comments

问题出现的原因是因为变量${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+中可用。

哦,是的,非常抱歉给你带来了困惑。

0
0 Comments

问题出现的原因是需要将一个字符串变量中的特殊字符转义,以便在使用sed命令时不会被识别为正则表达式的特殊字符。解决方法是使用sed命令将特殊字符转义。

在上述代码中,使用了sed命令对字符串变量old_line进行转义,并将转义后的结果赋值给old_line。具体的转义操作是将old_line中的特殊字符[]$.*[\^]替换为\\&,这样就实现了对特殊字符的转义。

接下来的一行代码使用sed命令将old_line替换为new_line,并将替换结果应用到文件ethernet中。

通过以上操作,成功实现了对字符串变量中特殊字符的转义,从而解决了问题。

对于更一般的情况,除了上述特殊字符外,还需要对/\&进行转义处理。

0