使用sed或awk匹配后替换行

时间:2016-05-27 02:42:47

标签: linux bash shell awk sed

我正在尝试创建一个基本上使用var passwordInput = $('[name=newPassword]').val(); var tests = { 1:/[a-z]/.test(passwordInput), 2:/[A-Z]/.test(passwordInput), 3:/[0-9]/.test(passwordInput), 4:passwordInput.length >= 8 }; for(var i=1; i<=4; i++) $('.strength-check__rule[data-index=' +i+ ']') [ tests[i] ? 'addClass' : 'removeClass' ]('check-rule--pass'); 来查找网站的 IP 的小脚本,然后将其传递给 sed / < strong> awk / grep 来替换一行。这是当前文件的样子:

dig +short

所以,基本上,我想在文本文件中搜索'#Server'行,然后用从挖掘获取的 IP 地址替换它下面的两行。强>

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

2 个答案:

答案 0 :(得分:1)

根据OP,它不是100%清楚地确定需要替换的地方,但是在这里使用GNU sed 和<强>的bash 即可。在&#34; 3 &#34;之后更换两行。使用标准输入

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 的更多信息,请参阅:
&#34; 5.9。 &#39; r&#39;命令不是将文件插入文本&#34;在此sed FAQ

答案 1 :(得分:0)

这是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. 使用修改后的版本覆盖原始文件。