繁体   English   中英

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

[英]How do I add a line of text to the middle of a file using 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 的 output 。 然后,对于每一行,我们将行 append 到保留空间,用换行符分隔它们:

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:在两行上查找模式,而不是在该模式之后替换

这是 Perl 解决方案:

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

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

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

  • -e执行 perl 代码

$f用作标志以指示名称服务器字符串已被找到

这可能对您有用:

 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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM