我正在尝试创建一个基本上使用dig +short
来查找网站IP的小脚本,然后将其通过管道传输到sed/awk/grep以替换一行。这是当前文件的样子:
#Server
123.455.1.456
246.523.56.235
所以,基本上,我想在文本文件中搜索"#Server"行,然后将其下面的两行替换为从 dig 获取的 IP 地址。
我了解 sed 的一些语法,但我真的很难弄清楚如何替换匹配项下方的两行。任何帮助都非常感谢。
基于 OP,并不是 100% 清楚需要在哪里替换什么,但这里有一个针对一般情况的单行代码,使用 GNU sed 和 bash。 将"3"后面的两行替换为标准输入:
echo Hoot Gibson | sed -e '/3/{r /dev/stdin' -e ';p;N;N;d;}' <(seq 7)
输出:
1
2
3
Hoot Gibson
6
7
注意:sed 的 r 命令是不透明的文档(无论如何在 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
解释:
- 将
$newip
传递给awk
- 如果当前行的第一个字段是
#Server
,则设l
= 当前行号。 - 否则,如果当前行是过去
#Server
,则打印新 IP。 - 否则,如果当前行不是过去两个
#Server
,则打印该行。 - 用修改后的版本覆盖原始文件。