我有一份像下面这样的文件。我希望将模式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
}
}发布于 2020-12-02 00:29:38
$ 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-02 01:09:16
考虑到您的示例,您可以使用此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-02 14:59:04
使用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};' inputhttps://stackoverflow.com/questions/65100288
复制相似问题