[英]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.