sed:删除文件中的所有匹配项并在第一个匹配项所在的位置插入一些行

sed:删除文件中的所有匹配项并在第一个匹配项所在的位置插入一些行

假设我想/etc/ntp.conf使用自动更新我的配置sedntp.conf允许定义的格式列表通过对整个文件中出现的行使用相同的关键字。例如:

# first block occurrences
server 1.1.1.1
server 2.2.2.2

driftfile /var/lib/ntp/drift

# second block of occurrences
server 3.3.3.3
server 4.4.4.4

现在,我已经更新了服务器列表ntp,例如 5.5.5.5、6.6.6.6 和 7.7.7.7。结果我想得到:

# first block occurrences
server 5.5.5.5
server 6.6.6.6
server 7.7.7.7

driftfile /var/lib/ntp/drift

# second block of occurrences

我可以用 来做吗sed?它是解决这个问题的正确工具还是我应该使用其他工具?

PS:注释掉第二个块(或两个块)的出现也可能是一种选择。

答案1

list.txt如果您在名为 的文件中有新的服务器列表cwd

sed '/^server/{x;//!r list.txt
d}' /etc/ntp.conf

或者,如果您不想使用文件而是硬编码新服务器名称:

sed '/^server/{x;//!c\
server 1\
........\
server n-1\
server n
d}' /etc/ntp.conf

这假设至少有一个未评论 server 线在您的/etc/ntp.conf(此外,它不会删除任何server被注释掉的行 - 您也可以更改正则表达式以包含这些行)。如果您想插入这些行,即使原始文件中没有服务器条目(在这种情况下,在文件末尾添加新服务器)您可以执行以下操作:

sed '/^server/{x;//!r list.txt
d}
${x;//!r list.txt
x}' /etc/ntp.conf

或者如果您喜欢使用,请使用相同的条件c\- 我将把它作为练习。请记住,当使用c\所有反斜杠更改行时,必须使用反斜杠转义嵌入的换行符(如我的示例中所示)。

答案2

sed '
/^server/ d
/first block/a\
server 5.5.5.5\
server 6.6.6.6\
server 7.7.7.7
' /etc/ntp.conf

仅更改第一次出现的情况:

# first block occurrences
server 5.5.5.5
server 6.6.6.6
server 7.7.7.7

driftfile /var/lib/ntp/drift

# second block of occurrences

相关内容