首页 > 解决方案 > SED - 用字符串换行变量替换字符串换行符

问题描述

我在文件中有以下内容

  dhcp_option_domain:
  - test.domain

我需要做的是:

每当值 'dhcp_option_domain:' 后跟换行符和 ANY 字符串时,将其替换为 'dhcp_option_domain:' 后跟换行符和变量。

即,如果我设置 dhcp_domain="different.com" 的变量,那么上面的字符串将转换为:

  dhcp_option_domain:
  - different.com

请注意,这两行都有并且需要保持前导 2 个空格。

我不想只在“test.domain”上进行搜索和替换,因为我有一些使用它的情况,并且每次运行 sed 命令时值都可能不同。

我尝试了几种方法,例如:

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

但是不能让它工作。谢谢。

标签: sed

解决方案


正如手册所解释的

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

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

一个可能的解决方案:

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

/dhcp_option_domain:$/部分是地址。以下命令仅在与该模式匹配的行上执行。

{ }命令将多个命令组合成一个块。

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

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

  • sed 程序中的文字换行符(在 之后需要c\),然后
  •   - (将这些字符按字面意思放在模式空间中,然后
  • '(shell 语法的一部分,终止以 开头的单引号部分sed '...),然后
  • "(开始一个双引号部分),然后
  • $dhcp_domain(因为它在双引号中,所以插入了dhcp_domainshell 变量的内容),然后
  • "(终止双引号部分),然后
  • '(开始另一个单引号部分),然后
  • 再次换行(在 之后终止文本c\),然后
  • }(关闭由 开始的块{)。

推荐阅读