sed命令,如果模式匹配,则删除行,然后在以下行中再次找到模式,然后将其删除

时间:2018-11-29 06:34:07

标签: sed

compute_hosts:
  compute1:
    ip: 12.12.12.12
  compute2:
    ip: 13.13.13.13
#  compute3:
#    ip: 14.13.12.12
#  compute4:
#    ip: 12.23.34.45

metering-compute_hosts:
  compute1:
    ip: 31.13.13.23
  compute2:
    ip: 57.67.575.45
#  compute3:
#    ip: 32.322.4.35
#  compute4:
#    ip: 23.435.67.7

SED命令删除具有计算4及其IP的行。 IP必须使用模式进行搜索 预期输出:

compute_hosts:
      compute1:
        ip: 12.12.12.12
      compute2:
        ip: 13.13.13.13
    #  compute3:
    #    ip: 14.13.12.12

 metering-compute_hosts:
      compute1:
        ip: 31.13.13.23
      compute2:
        ip: 57.67.575.45
    #  compute3:
    #    ip: 32.322.4.35

计算4及其IP应该在输出中删除

4 个答案:

答案 0 :(得分:2)

此sed会删除带模式的行和之后的一行:

sed '/compute4/,+1d'

测试:

$ sed '/compute4/,+1d' compute
compute_hosts:
  compute1:
    ip: 12.12.12.12
  compute2:
    ip: 13.13.13.13
#  compute3:
#    ip: 14.13.12.12

metering-compute_hosts:
  compute1:
    ip: 31.13.13.23
  compute2:
    ip: 57.67.575.45
#  compute3:
#    ip: 32.322.4.35

答案 1 :(得分:2)

sed -re '/compute4/ {N;/\s+ip:/d}'

尝试一下。

N连接模式空间中的下一个输入行

测试:

$ cat compute | sed -re '/compute4/ {N;/\s+ip:/d}'
compute_hosts:
  compute1:
    ip: 12.12.12.12
  compute2:
    ip: 13.13.13.13
#  compute3:
#    ip: 14.13.12.12

metering-compute_hosts:
  compute1:
    ip: 31.13.13.23
  compute2:
    ip: 57.67.575.45
#  compute3:
#    ip: 32.322.4.35

答案 2 :(得分:0)

编辑: :由于OP告诉字符串computer4的下一行可能没有IP,因此请使用此匹配功能首先在行中对其进行匹配。

awk '/compute4/{flag=1;next} flag && match($0,/[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+/){flag="";next} 1'  Input_file


考虑到您的Input_file与所示示例相同,请尝试以下操作(如果您对awk感到满意)。

awk '/compute4/{getline;next} 1'  Input_file

答案 3 :(得分:0)

使用awk可以正常工作:

awk --posix '/compute4/,/[0-9]{1,3}(\.[0-9]{1,3}){3}/{next}{print}' input_file
  • 范围运算符/pattern1/,/pattern2/继续从与/pattern1/匹配的行返回 true ,直到与/pattern2/匹配的行。
  • 我们要排除以上行;以下{next}就可以了。