如何删除匹配模式前后的行
How to delete lines before and after matching pattern
我有一个如下所示的文件。我想搜索模式 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
}
}
$ 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
}
}
鉴于你的例子,你可以使用这个 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
}
}
使用 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
我有一个如下所示的文件。我想搜索模式 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
}
}
$ 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
}
}
鉴于你的例子,你可以使用这个 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
}
}
使用 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