匹配后使用 sed 或 awk 替换行



我正在尝试创建一个基本上使用dig +short来查找网站IP的小脚本,然后将其通过管道传输到sed/awk/grep以替换一行。这是当前文件的样子:

#Server
123.455.1.456
246.523.56.235

所以,基本上,我想在文本文件中搜索"#Server"行,然后将其下面的两行替换为从 dig 获取的 IP 地址。

我了解 sed 的一些语法,但我真的很难弄清楚如何替换匹配项下方的两行。任何帮助都非常感谢。

基于 OP,并不是 100% 清楚需要在哪里替换什么,但这里有一个针对一般情况的单行代码,使用 GNU sedbash。 将"3"后面的两行替换为标准输入

echo Hoot Gibson | sed -e '/3/{r /dev/stdin' -e ';p;N;N;d;}' <(seq 7)

输出:

1
2
3
Hoot Gibson
6
7

注意:sedr 命令是不透明的文档(无论如何在 Linux 中)。 有关 r 的详细信息,请参阅:
"5.9. 'r' 命令没有将文件插入文本中",在此 sed 常见问题解答中。

以下是

awk中的方法:

newip=12.34.56.78
awk -v newip=$newip '{
  if($1 == "#Server"){
    l = NR;
    print $0
  }
  else if(l>0 && NR == l+1){
    print newip
  }
  else if(l==0 || NR != l+2){
    print $0
  }
}' file > file.tmp
mv -f file.tmp file

解释:

  1. $newip传递给awk
  2. 如果当前行的第一个字段是 #Server ,则设 l = 当前行号。
  3. 否则,如果当前行是过去#Server,则打印新 IP。
  4. 否则,如果当前行不是过去两个#Server,则打印该行。
  5. 用修改后的版本覆盖原始文件。

相关内容

  • 没有找到相关文章

最新更新