regex - sed 两次添加替换文本

标签 regex linux bash sed

我从未见过 sed 有这样的行为,但我正在尝试用我自己的 3 个条目(包括“名称服务器”)替换/etc/resolv.conf 中的所有“名称服务器”实例。我尝试过的每个组合都会将我的 3 个条目添加两次,所以我有 6 个条目。

sed -i 's/.*nameserver.*/nameserver 10.1.1.1\nnameserver 10.1.1.2\nnameserver 10.1.1.3/g'/etc/resolv.conf

哪些输出

nameserver 10.1.1.1
nameserver 10.1.1.2
nameserver 10.1.1.3
nameserver 10.1.1.1
nameserver 10.1.1.2
nameserver 10.1.1.3

所以,正确的顺序和条目,但添加了两次。我也尝试将其缩小到名称服务器和 ip,但仍然打印两次相同的输出。

sed -i "s/^nameserver [0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1 ,3\}\.[0-9]\{1,3\}/名称服务器 10.1.1.1\n名称服务器 10.1.1.2\n名称服务器 10.1.1.3/g"

我在这里真的很困惑,似乎无法通过这个。任何帮助表示赞赏。

预计到达时间: 当前resolv.conf

search domain1.net. domain2.net. domaine.com.
nameserver 192.168.1.1
nameserver 192.168.1.2

期望的输出

search domain1.net. domain2.net. domaine.com.
nameserver 10.1.1.1
nameserver 10.1.1.2
nameserver 10.1.1.3

最佳答案

您在原始文件中出现了两次“名称服务器”,因此 sed 替换了它们中的每一个。

你可以做到 multiline replacements使用 sed,但更简单的做法是删除不需要的行,然后附加需要的行。虽然我不熟悉 /etc/resolv.conf,所以我不知道顺序是否重要。

sed '/nameserver.*/d' /etc/resolv.conf
cat <<'EOF'
nameserver 10.1.1.1
nameserver 10.1.1.2
nameserver 10.1.1.3
EOF

如果输出看起来不错,请运行以下命令以实际进行更改:

sudo sed -i '/nameserver.*/d' /etc/resolv.conf
sudo tee -a /etc/resolv.conf >/dev/null <<'EOF'
nameserver 10.1.1.1
nameserver 10.1.1.2
nameserver 10.1.1.3
EOF

关于regex - sed 两次添加替换文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58366257/

相关文章:

当正则表达式正确时 Java 正则表达式问题

c++ - 在 C++ 中使用正则表达式标记字符串并保留定界符

linux - 使用 dup2 的 Ubuntu Linux C 编程中的多个管道

c++ - 加载共享库时出错 : No such file or directory even after using LD_LIBRARY_PATH and changing $PATH

python - 如何在 Raspberry Pi 启动时启动网络摄像头并将其存储在闪存驱动器中

bash - 捕获 "rm: fts_read: No such file or directory"错误并继续

ruby - Ruby 中的正则表达式负后视似乎不起作用

javascript - 使用 RegEx 用字符串换行文本

windows - 在 Linux/Windows 上自动删除临时文件

arrays - 如何通过当前 shell (zsh/bash) 检测数组开始索引?