1

我有一个像下面这样的文件。我想搜索模式 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
}
}
4

3 回答 3

3
$ 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
}
}
于 2020-12-02T00:29:38.383 回答
0

给出你的例子,你可以使用这个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
}
}
于 2020-12-02T01:09:16.763 回答
0

使用 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
于 2020-12-02T14:59:04.173 回答