我试图在bash脚本中的文本文件中间添加一行文本.具体来说,我正在try 向/etc/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,但在上面的任何文本之下.最后,我要下定决心.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能做的吗?或者,创造性地用greping重新创建文件是我最好的做法吗?

推荐答案

下面是一个使用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标志 suppress sed的输出.然后,对于每一行,我们将该行附加到保留空间,并用换行符分隔它们:

H

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

x

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

s/^\n//

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

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

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

p

Linux相关问答推荐

awk:try 将时间戳字符串转换为unix纪元时间

Aarch64在Linux上是否有红色区域,如果有,是16个字节还是128个字节?

如何注释掉SLURM中的延迟调度命令?

通过shell 脚本基于AM/PM对日期时间字段进行排序

cu可以从串口读取,但我自己的C程序不能

将(覆盖)文件移动到不同位置的同名文件夹中

如何过滤 Bash 的正则表达式(Linux)中的所有值,除了一个?

为什么组合的查找和重命名命令在 bash shell 下不能按预期工作?

在不编写任何代码的情况下,是否有一个命令可以检索当前 shell 的亲和力中的可用内核数?

在 Ansible 中使用 JSON 查询过滤数据以从 ansible_fact 中提取数据

如何使用 AWK 合并两个文件?

哪个程序在给定任何文件的情况下创建一个 C 数组?

polkitd未注册身份验证代理的解释

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

Shell 脚本, echo 消息后在同一行读取

Linux SCHED_OTHER、SCHED_FIFO 和 SCHED_RR - 区别

后缀 - status=bounced(未知用户myuser)

ImportError:在 ubuntu 14.04 中没有名为 _io 的模块

id_rsa.pub 文件 SSH 错误:格式无效

学习内核编程