我在文件中包含以下内容
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
但是无法使其正常工作。 谢谢。
答案 0 :(得分:2)
sed
通过在输入的每一行上执行以下循环来进行操作:首先,sed从输入流中读取一行,删除所有尾随的换行符并将其放在模式空间中。然后执行命令
您的正则表达式(dhcp_option_domain:\n.*
)不匹配,因为首先在模式空间中没有\n
。
可能的解决方案:
sed '/dhcp_option_domain:$/{n;c\
- '"$dhcp_domain"'
}'
/dhcp_option_domain:$/
部分为an address。以下命令仅在与该模式匹配的行上执行。
{
}
命令将多个命令分组为一个块。
n
命令打印出当前模式空间,并用下一行输入替换。
c\
命令用脚本中后面的内容替换当前的模式空间。这里有点棘手。我们有:
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
n
如果未禁用自动打印,请打印图案空间,然后, 无论如何,请用下一行输入替换模式空间。如果 没有更多的输入,然后sed退出,不再处理 命令。
答案 2 :(得分:0)
这可能对您有用(GNU sed):
sed '/dhcp_option_domain:$/{p;s// - '"${var}"'/;n;d}' file
匹配dhcp_option_domain:
,进行打印,替换为新域名(保持缩进),打印当前行并获取下一行(n
)并删除。