如何去除多线多模式,awk pcre2grep-sed



我有这个文本文件

tittleofthis123
<Bunlde ver=5.0>
<Packages>    
<Package Type="app" FileName="Package_ARM64_beta.msix" Offset="79" Size="5791033">
<Resources>
rescode11
</Resources>
<b4:Dependencies>
depcode12
</b4:Dependencies>
</Package>
<Package Type="app" FileName="Package_x64_beta.msix" Offset="580113" Size="7195285">
<Resources>
rescode21
rescode22
</Resources>
</Package>
<Package Type="res" FileName="Package_lang-cy.msix" Offset="579" Size="15">
<Resources>
rescode31
</Resources>
</Package>
<Package Type="res" FileName="Package_lang-af.msix" Offset="5791" Size="1578">
<Resources>
rescode41
</Resources>
</Package>
</Packages>
</Bundle>

我需要输出

tittleofthis123
<Bunlde ver=5.0>
<Packages>    
<Package Type="app" FileName="Package_x64_beta.msix" Offset="580113" Size="7195285">
<Resources>
rescode21
rescode22
</Resources>
</Package>
<Package Type="res" FileName="Package_lang-af.msix" Offset="5791" Size="1578">
<Resources>
rescode41
</Resources>
</Package>
</Packages>
</Bundle>

我试过这个

pcre2grep -M -v 'ARM64.*(n|.)*</Package>|lang-cy.*(n|.)*</Package>' 123.txt

但当然,结果是不对的,因为所有的包都有相同的</Package>,所以它只过滤ARM64,而是过滤掉所有的底层包。我还有更多的包要排除,所以我可能不应该使用-v逆,但不知道如何保留Title, <Bundle>, and <Packages>

试过这个和这个

awk '/ARM64/,/</Package>/ {next} {print}' 123.txt

实际上效果很好。但我不明白如何让它过滤多个像'/ARM64/,/</Package>//lang-cy/,/</Package>/这样的包。同样,我需要排除很多包,所以可能不做{next}的事情,仍然不知道如何保留Title, <Bundle>, and <Packages>

我认为这非常接近我需要的

sed -n '/<Package/{:a;N;/n*</Package>/!ba; /x64/p}' 123.txt

它也工作得很好,但我的能力仍然很差,不知道如何加入更多像x64lang-af这样的过滤器。Title, <Bundle>, and <Packages>也是如此

事实上,情况基本相同,但我根本不明白的答案

awk '/ARM64/,/</Package>/ {next} {print}' 123.txt

实际上效果很好。但我不知道怎么过滤不止一个像'/ARM64/,/</Package>//lang-cy/,/</Package>/

由于两个结束条件相等,您可以只使用||(备选方案(按照的方式为ARM64lang-cy建立触发条件

awk '/ARM64/||/lang-cy/,/</Package>/ {next} {print}' 123.txt

并再次使用||来获得另一个排除,例如,也可以删除您可能进行的lang-af

awk '/ARM64/||/lang-cy/||/lang-af/,/</Package>/ {next} {print}' 123.txt

等等

警告:您所拥有的似乎类似于XML的东西,请注意GNUAWK最适合与可以使用正则表达式描述的实体一起使用。如果你的,不能用这些来描述,就像XML的情况一样,那么你需要一个工具来处理Chomsky Type-2装置,而不是严格意义上的正则表达式。

这可能对你有用(GNU sed(:

sed '/<Package Type/{:a;N;/</Package>/!ba;/_x64_|_lang-af/!d}' file

收集<Package Type</Package>之间的行,如果集合包含_x64__lang-af,则不要删除该集合。

相关内容

  • 没有找到相关文章

最新更新