linux - 如何使用 bash 在文件中间添加一行文本?

我正在尝试在 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 可以做的吗?或者创造性地重新创建文件是我最好的举措吗?

最佳答案

这是一个使用 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

它是如何工作的:首先,使用 -n 标志抑制 sed 的输出。然后,对于每一行,我们将该行附加到保留空间,用换行符分隔它们:

H

当我们到达文件末尾(由 $ 寻址)时,我们将保持空间的内容移动到模式空间:

x

如果模式空间中的第一行是空白的,我们将其替换为空。

s/^\n//

然后我们用包含 nameserver 127.0.0.1 的行替换以 nameserver 开头的第一行,新行(您的 sed 版本可能不支持 \n,在这种情况下,将 n 替换为文字换行符)和原始行(由 & 表示):

s/nameserver .*$/nameserver 127.0.0.1\n&/

现在我们只需要打印结果:

p

https://stackoverflow.com/questions/6739258/

相关文章:

c - 为什么 pthread 互斥锁被认为是 "slower"而不是 futex?

linux - "zero copy networking"与 "kernel bypass"?

python - 在 Ubuntu 中启动时运行 Python 脚本

linux - 使用 linux 命令行 (bash) 从网络摄像头拍照

c++ - 如何在不重新打印的情况下更新终端中的打印消息

c - 在 Linux 中何时使用 pthread_exit() 以及何时使用 pthread_jo

c++ - 如何在 Linux 中命名线程?

linux - 为什么 Linux 不通过 TSS 使用硬件上下文切换?

ruby-on-rails - Ruby on Rails - 无法将 "\x89"从 ASCII-

linux - 在 PHP CLI 中设置 max_execution_time