SED-将字符串换行符替换为字符串换行符varable

时间:2018-08-04 03:20:14

标签: sed

我在文件中包含以下内容

  dhcp_option_domain:
  - test.domain

我需要做的是这样

每当值“ dhcp_option_domain:”后跟换行符,然后再加上任何字符串时,将其替换为“ dhcp_option_domain:”后跟换行符和变量。

即,如果我设置了dhcp_domain =“ different.com”变量,则上面的字符串将转换为:

  dhcp_option_domain:
  - different.com

请注意,这两行都必须且必须保持前两个空格。

我不想在'test.domain'上进行搜索和替换,因为我有几种情况可以使用它,并且每次运行sed命令时值可能都不同。

我尝试了一些方法,例如:

dhcp_domain="something.com"
sed -i 's|dhcp_option_domain:\n.*|dhcp_option_domain:\n  - $dhcp_domain|g' filename

但是无法使其正常工作。 谢谢。

3 个答案:

答案 0 :(得分:2)

the manual explains

  

sed通过在输入的每一行上执行以下循环来进行操作:首先,sed从输入流中读取一行,删除所有尾随的换行符并将其放在模式空间中。然后执行命令

您的正则表达式(dhcp_option_domain:\n.*)不匹配,因为首先在模式空间中没有\n

可能的解决方案:

sed '/dhcp_option_domain:$/{n;c\
  - '"$dhcp_domain"'
}'

/dhcp_option_domain:$/部分为an address。以下命令仅在与该模式匹配的行上执行。

{ }命令将多个命令分组为一个块。

n命令打印出当前模式空间,并用下一行输入替换。

c\命令用脚本中后面的内容替换当前的模式空间。这里有点棘手。我们有:

  • sed程序中的文字换行符(在c\之后需要),然后
  •   - (将这些字符原样放在模式空间中,然后
  • '(shell语法的一部分,以sed '...开头的单引号部分结束),然后
  • "(以双引号开头),然后
  • $dhcp_domain(由于它用双引号引起来,因此会插入dhcp_domain shell变量的内容),然后
  • "(终止双引号的部分),然后
  • '(开始另一个单引号的部分),然后
  • 再次使用文字换行符(在c\之后终止文本),然后
  • }(关闭由{开始的块)。

答案 1 :(得分:1)

默认情况下,sed逐行工作(使用换行符来区分换行符)

$ cat ip.txt
foo baz
  dhcp_option_domain:
  - test.domain
123
  dhcp_option_domain:
$ dhcp_domain='something.com'
$ sed '/^  dhcp_option_domain:/{n; s/.*/  - '"$dhcp_domain"'/}' ip.txt
foo baz
  dhcp_option_domain:
  - something.com
123
  dhcp_option_domain:
  • /^ dhcp_option_domain:/要匹配的条件
    • {}将满足此条件的多个要执行的命令分组
  • n获取下一行
  • s/.*/ - '"$dhcp_domain"'/根据需要替换它-请注意,shell变量不会在单引号内展开,有关详细信息,请参见sed substitution with bash variables
  • 请注意,文件中的最后一行不会触发更改,因为没有其他行
  • 在GNU sed上进行了测试,其他实现的语法可能有所不同

来自GNU sed manual

  

n

     

如果未禁用自动打印,请打印图案空间,然后,   无论如何,请用下一行输入替换模式空间。如果   没有更多的输入,然后sed退出,不再处理   命令。

答案 2 :(得分:0)

这可能对您有用(GNU sed):

sed '/dhcp_option_domain:$/{p;s//  - '"${var}"'/;n;d}' file

匹配dhcp_option_domain:,进行打印,替换为新域名(保持缩进),打印当前行并获取下一行(n)并删除。