Bash 如何在匹配模式之前和之后删除行

Bash 如何在匹配模式之前和之后删除行,bash,awk,sed,emc,multipath,Bash,Awk,Sed,Emc,Multipath,我有一个像下面这样的文件。我想搜索模式ABC_数据作为一个变量,匹配后,我想从前一个“multipath”行删除到包含“}”字符的行。“}”可以在ABC_数据之后或与ABC_数据在同一行中 样本输出 multipaths { multipath { wwid 360000970000267600432533030353944 alias ABC_DATA_11 } multipath { wwid 360000970000267600432533030353945 alias DEF_DATA_

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

样本输出

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
}
}

根据您的示例,您可以使用以下
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
}
}

根据您的示例,您可以使用以下
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

使用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

欢迎来到堆栈溢出。请在问题中添加您自己的代码。你至少要展示你自己为解决这个问题所做的研究。欢迎这样做,请在你的问题中以代码的形式添加你的努力,这是非常值得鼓励的。欢迎使用堆栈溢出。请在问题中添加您自己的代码。你至少要展示你自己为解决这个问题所做的大量研究。欢迎这样做,请在你的问题中以代码的形式添加你的努力,这是非常受鼓励的。你能解释一下吗?设置
or='1'
在做什么?谢谢Ed,它可以工作:)。我将传递ABC_数据作为bash脚本的第一个参数。因此,awk-v RS='multipath\\s*{[^}]*'$1'[^}]*}\\s*(\n|$)'-v ORS='1'/etc/multipath.test是我的最终解决方案。@Ed Moton+1.伟大的regexp:-->删除所有不需要的数据并
awk
显示
预期输出
@老兄,我没有将ORS设置为1,我将ORS设置为null,这样awk在输出每条记录时不会添加换行符,然后末尾的
1
只是
{print}
@EdMorton:Head smack的常用缩写。当然我如此专注于
or='1'
,以至于我没有注意到空间!它是
ORS='1'
(注意空格),所以
'1'
就是程序……你能解释一下吗?设置
or='1'
在做什么?谢谢Ed,它可以工作:)。我将传递ABC_数据作为bash脚本的第一个参数。因此,awk-v RS='multipath\\s*{[^}]*'$1'[^}]*}\\s*(\n|$)'-v ORS='1'/etc/multipath.test是我的最终解决方案。@Ed Moton+1.伟大的regexp:-->删除所有不需要的数据并
awk
显示
预期输出
@老兄,我没有将ORS设置为1,我将ORS设置为null,这样awk在输出每条记录时不会添加换行符,然后末尾的
1
只是
{print}
@EdMorton:Head smack的常用缩写。当然我如此专注于
or='1'
,以至于我没有注意到空间!它是
ORS='1'
(注意空格),因此
'1'
是程序…您是否应该使用
-lpe
,这样您就不需要
打印
?您是否应该使用
-lpe
,这样您就不需要
打印