Sed 删除包含其他图案的多行图案

Sed 删除包含其他图案的多行图案,sed,awk,grep,Sed,Awk,Grep,我想删除包含另一个指定模式的模式的所有实例(方便地在新行上): 样本输入: header BEGIN: 1abc 7wurw END: BEGIN: 22xyz MID: 34utov END: 期望输出: header BEGIN: 1abc 7wurw END: 我在找可能的一行。任何帮助都将不胜感激。开始{in_block=0;} BEGIN { in_block = 0; } /BEGIN:/ { in_block = 1; lineno = 0; arr[lineno] = $0;

我想删除包含另一个指定模式的模式的所有实例(方便地在新行上):

样本输入:

header
BEGIN:
1abc
7wurw
END:
BEGIN:
22xyz
MID:
34utov
END:
期望输出:

header
BEGIN:
1abc
7wurw
END:
我在找可能的一行。任何帮助都将不胜感激。

开始{in_block=0;}
BEGIN { in_block = 0; }
/BEGIN:/ { in_block = 1; lineno = 0; arr[lineno] = $0; must_write = 1; next; }
/END:/ { in_block = 0; 
         if (must_write == 1) {
              for (i = 0; i <= lineno; ++i) print arr[i]; print; 
         }
         next;
}
/MID:/ { must_write = 0; next; }
in_block == 1 && must_write == 1 { lineno++; arr[lineno] = $0; next; }
in_block == 0 { print }
/开始:/{in_block=1;lineno=0;arr[lineno]=0;必须_write=1;next;} /结束:/{in_block=0; 如果(必须写入==1){
对于(i=0;i我将使用
RS,ORS
变量。以下是一条线性关系:

awk -v RS="BEGIN:\n" -v ORS="" '/MID/{next}NR>1{printf RS}7' file
使用您的文件进行测试:

kent$  cat f
header
BEGIN:
1abc
7wurw
END:
BEGIN:
22xyz
MID:
34utov
END:

kent$  awk -v RS="BEGIN:\n" -v ORS="" '/MID/{next}NR>1{printf RS}7' f
header
BEGIN:
1abc
7wurw
END:

注意,
printfrs
不是很好,我使用它是因为我知道它是
BEGIN:
好的做法是
printf“%s”,RS
使用
GNU-sed

sed -e :a -e '/^BEGIN:/,/^END:/ { /END:/!{$!{N;ba};};/MID:/d;}' inputfile
对于您的输入,它将返回:

header
BEGIN:
1abc
7wurw
END:

这在样本上对我有效:

sed '/BEGIN:/,/END:/{/BEGIN/{h;d};H;/END:/!d;x;/MID:/d}' input.txt

我很确定它可以简化很多。

这个
gnu awk
END:
来划分部分,所以
BEGIN:
-
END:
不是真的,但它可以:

awk '!/MID:/{printf "%s%s\n",$0,RT}' RS="END:" t
header
BEGIN:
1abc
7wurw
END:
一行

sed -n '/BEGIN:/,/END:/{H;/END/{s/.*//;x;/\nMID:/ !p;};}' YourFile
无法使用最后一个;(我必须在AIX上保留一个“\n”)(应该可以在GNU-sed上使用)

这可能适用于您(GNU-sed):


很好:-)但结尾的“7”是什么意思?@Ronald the 7在这里等于42;)@hek2mgl所以我发现了,但我不知道这个句法结构。因为我发现除了零以外的任何东西都会打印整个“行”。所以我猜它类似于:一个表达式求值为真(如果是数字,则为非零)和一个默认动作(打印).对吗?太棒了!谢谢@okapiho抱歉,我应该使用GNU sed添加。
sed -n '/BEGIN:/,/END:/ {
   H
   /END:/ {
      s/.*//
      x
      /\nMID:/ !p
      }
   }' YourFile
sed -n '/BEGIN:/,/END:/{H;/END/{s/.*//;x;/\nMID:/ !p;};}' YourFile
#for AIX
sed -n '/BEGIN:/,/END:/{H;/END/{s/.*//;x;/\nMID:/ !p;}
}' YourFile
sed '/^BEGIN:/{:a;$!{N;/END:/!ba};/MID:/d}' file