如何使用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脚本? 这是sedawk可以做的吗? 还是会创造性地重新创build文件是我的最佳举措?

Solutions Collecting From Web of "如何使用bash将一行文本添加到文件的中间?"

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

假设你想要在search行之后立即插入,这要简单得多:

 sed -ie '/^search/a nameserver 127.0.0.1' filename 
  • -i :编辑文件
  • -e :允许在sed表达式中执行脚本/命令
  • a mynewtext :命令告诉sed在匹配的模式之后插入mynewtext文本

awk '/^nameserver/ && !modif { printf("INSERT\n"); modif=1 } {print}'

感觉如何?

 sed -e ':a;N;$!ba;s/nameserver/nameserver 127.0.0.1\nnameserver/' /etc/resolv.conf 

(类似于这样: sed:在两行中查找模式,不能在该模式之后替换 )

这可能适合你:

  sed -e '/nameserver/{x;/./b;x;h;i\nameserver 127.0.0.1' -e '}' resolv.conf 

或GNU sed:

 sed -e '0,/nameserver/{//i\nameserver 127.0.0.1' -e '}' resolv.conf 

这是一个Perl解决方案:

perl -lne 'if (not $f and /^nameserver/){ print "nameserver 127.0.0.1"; $f=1 }; print' resolv.conf

  • -n循环输入文件的每一行,不要自动打印每一行

  • -l在处理之前删除换行符,然后将其添加回来

  • -e执行Perl代码

$f用作一个标志来表示已经找到了名称服务器字符串