我有这个文本文件
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
它也工作得很好,但我的能力仍然很差,不知道如何加入更多像x64
和lang-af
这样的过滤器。Title, <Bundle>, and <Packages>
也是如此
事实上,情况基本相同,但我根本不明白的答案
awk '/ARM64/,/</Package>/ {next} {print}' 123.txt
实际上效果很好。但我不知道怎么过滤不止一个像
'/ARM64/,/</Package>/
和/lang-cy/,/</Package>/
由于两个结束条件相等,您可以只使用||
(备选方案(按照的方式为ARM64
和lang-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
,则不要删除该集合。