假设我想/etc/ntp.conf
使用自动更新我的配置sed
。ntp.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