gpt4 book ai didi

linux - sed/awk - 删除包含多个模式的多行 block

转载 作者:太空宇宙 更新时间:2023-11-04 05:58:38 25 4
gpt4 key购买 nike

在 xml 文件中,多行 block 由 <start></start> 标识。 。如果这些多行 block 包含一组任意顺序的模式(模式 1、模式 2 等),我需要查找并删除它们。

例如,如下所示:

<xml>
...
<start>
<x>pattern2</x>
<y>pattern1<y>
</start>
<start>
<x>pattern2</x>
<y>string1<y>
</start>
<start>
<y>string2<y>
<x>pattern1</x>
</start>
<start>
<x>pattern1</x>
<y>pattern2<y>
</start>
<start>
<x>string3</x>
<y>string4<y>
</start>
...
</xml>

如果仅搜索模式1,则应删除 block 1、3、4

<xml>
...
<start>
<x>pattern2</x>
<y>string1<y>
</start>
<start>
<x>string3</x>
<y>string4<y>
</start>
...
</xml>

如果仅搜索模式2,则应删除 block 1、2、4

<xml>
...
<start>
<y>string2<y>
<x>pattern1</x>
</start>
<start>
<x>string3</x>
<y>string4<y>
</start>
...
</xml>

如果搜索(模式1和模式2),则应删除 block 1、4

<xml>
...
<start>
<x>pattern2</x>
<y>string1<y>
</start>
<start>
<y>string2<y>
<x>pattern1</x>
</start>
<start>
<x>string3</x>
<y>string4<y>
</start>
...
</xml>

我成功地使用识别 block

sed -n "s/<start>/,/<\/start>/p" file

如何识别那些匹配无序多重模式的内容?

感谢您的帮助

最佳答案

$ awk '$0~"<start>"{f=1;p=0;a=""} 
f{a=a RS $0}
!f{print}
/pattern1/&&f{p=1}
$0~"</start>"{if(!p) print a;f=0}' file

<xml>
...

<start>
<x>pattern2</x>
<y>string1<y>
</start>

<start>
<x>string3</x>
<y>string4<y>
</start>
...
</xml>

您也可以推广到多种模式

$ awk '$0~"<start>"{f=1;p=0;a=""} 
f{a=a RS $0}
!f{print}
/pattern1/&&f{p++}
/pattern2/&&f{p++}
$0~"</start>"{if(p!=2) print a;f=0}' file
<xml>
...

<start>
<x>pattern2</x>
<y>string1<y>
</start>

<start>
<y>string2<y>
<x>pattern1</x>
</start>

<start>
<x>string3</x>
<y>string4<y>
</start>
...
</xml>

要消除多余的空行,请将 f{a=a RS $0} 更改为 f{a=a?a RS $0:$0}

关于linux - sed/awk - 删除包含多个模式的多行 block ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33301963/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com