【问题标题】:How to delete lines before and after matching pattern如何删除匹配模式前后的行
【发布时间】:2021-03-13 22:51:17
【问题描述】:

我有一个像下面这样的文件。我想搜索模式 ABC_DATA 作为变量,匹配后,我想从前一个“多路径”行删除到包含“}”字符的行。 "}" 可以在 ABC_DATA 之后或在同一行中。

样本输出

multipaths {
multipath {
wwid 360000970000267600432533030353944
alias ABC_DATA_11
}
multipath {
wwid 360000970000267600432533030353945
alias DEF_DATA_11
}
multipath {
wwid 360000970000267600432533030353946
alias ABC_DATA_12 }

multipath {
wwid 360000970000267600432533030353943
alias DEF_DATA_10
}
}

预期输出

multipaths {
multipath {
wwid 360000970000267600432533030353945
alias DEF_DATA_11
}
multipath {
wwid 360000970000267600432533030353943
alias DEF_DATA_10
}
}

【问题讨论】:

标签: bash awk sed emc multipath


【解决方案1】:
$ awk -v RS='multipath\\s*{[^}]*ABC_DATA[^}]*}\\s*(\n|$)' -v ORS= '1' file
multipaths {
multipath {
wwid 360000970000267600432533030353945
alias DEF_DATA_11
}
multipath {
wwid 360000970000267600432533030353943
alias DEF_DATA_10
}
}

【讨论】:

  • 你能解释一下吗?设置ORS='1' 在做什么?
  • 感谢 Ed,它有效 :)。我将 ABC_DATA 作为 bash 脚本的第一个参数传递。所以, awk -v RS='multipath\\s*{[^}]*'$1'[^}]*}\\s*(\n|$)' -v ORS= '1' /etc/multipath .test 是我的最终解决方案。
  • @Ed Moton。 +1。很棒的正则表达式:--> 删除所有不需要的数据,awk 显示 expected output!
  • @dawg 我没有将 ORS 设置为 1,我将 ORS 设置为 null 所以 awk 在输出每条记录时不会添加换行符,然后末尾的 1 只是{print} 的常用简写形式。
  • @EdMorton:当头一棒。当然。我是如此专注于ORS='1',以至于我没有注意到这个空间!它是ORS= '1'(注意空格),所以'1' 是程序...
【解决方案2】:

根据您的示例,您可以使用此perl

$ perl -0777 -lpe 's/\bmultipath\h+\{[^{}]*ABC_DATA[^{}]*}\s*//g' file
multipaths {
multipath {
wwid 360000970000267600432533030353945
alias DEF_DATA_11
}
multipath {
wwid 360000970000267600432533030353943
alias DEF_DATA_10
}
}

【讨论】:

  • 你应该使用-lpe,所以你不需要print
【解决方案3】:

使用sed,不是很可读但绝对可以:

sed '
   /^multipath {/ {
     :l
     /alias ABC_DATA/ {
       :f
       /}/ d
       N
       b f
     }
     /}/ b
     N
     b l
  }' input

或单行:

sed '/^multipath {/{:l; /alias ABC_DATA/{:f /}/d;N;bf};/}/b;N;bl};' input

【讨论】:

    猜你喜欢
    • 2019-11-05
    • 1970-01-01
    • 1970-01-01
    • 2018-09-13
    • 1970-01-01
    • 2018-07-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多