我正在尝试在 bash 脚本中的文本文件中间添加一行文本。具体来说,我正在尝试将名称服务器添加到我的 /etc/resolv.conf 文件中。目前,resolv.conf 看起来像这样:
# Generated by NetworkManager
domain dhcp.example.com
search dhcp.example.com
nameserver 10.0.0.1
nameserver 10.0.0.2
nameserver 10.0.0.3
我的目标是添加nameserver 127.0.0.1
位于所有其他名称服务器行上方,但位于其上方的任何文本下方。最后我希望我的resolve.conf 文件看起来像这样:
# Generated by NetworkManager
domain dhcp.example.com
search dhcp.example.com
nameserver 127.0.0.1
nameserver 10.0.0.1
nameserver 10.0.0.2
nameserver 10.0.0.3
这怎么可能通过 bash 脚本实现呢?这是 sed 或 awk 可以做的事情吗?或者创造性的 grep 重新创建文件是我最好的举动吗?
这是使用 sed 的解决方案:
$ sed -n 'H;${x;s/^\n//;s/nameserver .*$/nameserver 127.0.0.1\n&/;p;}' resolv.conf
# Generated by NetworkManager
domain dhcp.example.com
search dhcp.example.com
nameserver 127.0.0.1
nameserver 10.0.0.1
nameserver 10.0.0.2
nameserver 10.0.0.3
它是如何工作的:首先,使用以下命令抑制 sed 的输出-n
旗帜。然后,对于每一行,我们将其附加到保留空间,并用换行符分隔它们:
H
当我们到达文件末尾时(由$
)我们将保持空间的内容移动到模式空间:
x
如果模式空间中的第一行为空,我们将其替换为空。
s/^\n//
然后我们将第一行替换为nameserver
通过包含以下内容的行nameserver 127.0.0.1
,一个新行(您的版本sed
可能不支持\n
,在这种情况下替换n
带有换行符)和原始行(由&
):
s/nameserver .*$/nameserver 127.0.0.1\n&/
现在我们只需要打印结果:
p
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)