Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux sed/awk-删除包含多个图案的多行块_Linux_Bash_Awk_Sed - Fatal编程技术网

Linux sed/awk-删除包含多个图案的多行块

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

在xml文件中,多行块由
标识。 如果这些多行块包含一组任意顺序的图案(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这听起来像是一个非常有效的高质量技术要求。您为实施支付了多少费用?