Linux sed/awk-删除包含多个图案的多行块
在xml文件中,多行块由Linux sed/awk-删除包含多个图案的多行块,linux,bash,awk,sed,Linux,Bash,Awk,Sed,在xml文件中,多行块由标识。 如果这些多行块包含一组任意顺序的图案(pattern1、pattern2等),我需要查找并删除它们 例如,在以下情况下: <xml> ... <start> <x>pattern2</x> <y>pattern1<y> </start> <start> <x>pattern2&l
标识。
如果这些多行块包含一组任意顺序的图案(pattern1、pattern2等),我需要查找并删除它们
例如,在以下情况下:
<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>
...
模式2
模式1
模式2
string1
string2
模式1
模式1
模式2
弦3
弦4
...
如果仅搜索pattern1,则应删除块1、3、4
<xml>
...
<start>
<x>pattern2</x>
<y>string1<y>
</start>
<start>
<x>string3</x>
<y>string4<y>
</start>
...
</xml>
<xml>
...
<start>
<y>string2<y>
<x>pattern1</x>
</start>
<start>
<x>string3</x>
<y>string4<y>
</start>
...
</xml>
<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>
...
模式2
string1
弦3
弦4
...
如果仅搜索模式2,则应删除块1、2、4
<xml>
...
<start>
<x>pattern2</x>
<y>string1<y>
</start>
<start>
<x>string3</x>
<y>string4<y>
</start>
...
</xml>
<xml>
...
<start>
<y>string2<y>
<x>pattern1</x>
</start>
<start>
<x>string3</x>
<y>string4<y>
</start>
...
</xml>
<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>
...
string2
模式1
弦3
弦4
...
如果搜索(模式1和模式2),则应删除块1、4
<xml>
...
<start>
<x>pattern2</x>
<y>string1<y>
</start>
<start>
<x>string3</x>
<y>string4<y>
</start>
...
</xml>
<xml>
...
<start>
<y>string2<y>
<x>pattern1</x>
</start>
<start>
<x>string3</x>
<y>string4<y>
</start>
...
</xml>
<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>
...
模式2
string1
string2
模式1
弦3
弦4
...
我设法使用
sed -n "s/<start>/,/<\/start>/p" file
sed-n“s//,//p”文件
如何识别那些匹配的无序多模式
感谢您的帮助$awk'$0~”{f=1;p=0;a=”“}
$ 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>
f{a=a卢比$0}
!f{print}
/模式1/&f{p=1}
$0~“{if(!p)打印;f=0}”文件
...
模式2
string1
弦3
弦4
...
您还可以推广到多个模式
$ 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>
$awk'$0~'{f=1;p=0;a=”“}
f{a=a卢比$0}
!f{print}
/模式1/&f{p++}
/模式2/&f{p++}
$0~“{if(p!=2)打印;f=0}”文件
...
模式2
string1
string2
模式1
弦3
弦4
...
要消除多余的空行,请将
f{a=a RS$0}
更改为f{a=a?a RS$0:$0}
您已经向我们展示了您的输入,您的预期输出如何?哦,还有您尝试在bash和awk(您标记了它们)中解决此问题的代码?@ghoti预期输出已添加。解决方案应该基于在bash脚本中使用的awk或sed。@lafaler这听起来像是一个非常有效的高质量技术要求。您为实施支付了多少费用?