当前位置: 首页 > 知识库问答 >
问题:

如何使用多模式删除多行,awk pcre2grepsed

顾正初
2023-03-14

我有这个文本文件

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

但当然,结果是不对的,因为所有的包都有相同的

尝试了这个和这个

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

它实际上工作得很好。但是我不明白如何让它过滤多个包,例如'/ARM64/,/

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

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

它也很好用,但我的无能仍然是一样的,不知道如何加入更多像 x64lang-af 这样的过滤器标题也是如此,

实际上这是非常相似的情况,但是我一点也不理解这个答案


共有2个答案

海鸣
2023-03-14

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

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

收集<代码>之间的行

敖子安
2023-03-14
匿名用户

awk'/ARM64/,/

它实际上工作得很好。但是我不明白如何让它过滤多个包,例如'/ARM64/,/

由于两个结束条件相等,您可以使用< code>||(可选)来构建触发< code>ARM64和< code>lang-cy的开始条件,如下所示

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

并且再次使用< code>||来获得另一个排除,例如也删除您可能要做的< code>lang-af

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

等等。

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

 类似资料:
  • 问题内容: 我已经使用Python和Django建立了一个在线画廊。我刚刚开始添加编辑功能,从旋转开始。我使用sorl.thumbnail按需自动生成缩略图。 当我编辑原始文件时,我需要清理所有缩略图,以便生成新的缩略图。每个图片有三到四个(我在不同场合有不同的图片)。 我 可以 在文件变量中进行硬编码…但是这很混乱,如果我改变工作方式,则需要重新访问代码。 理想情况下,我想进行正则删除。用正则表

  • 问题内容: 问题: 我 在* 两个实体 A和B 之间 有 多对多关联 。我将 A实体 设置为其 关系 的 所有者 (inverse = true在b.hbm.xml中A的集合上)。 * 当我 删除一个A实体时 , 联接表中的 相应 记录也会被删除 。 当我 删除一个B实体时 , 联接表中的 相应 记录不会被删除 (完整性违反异常)。 - 让我们考虑一些非常简单的 示例 : 文件 a.hbm.xml

  • 问题内容: 我需要更新或删除几个文档。 当我更新时,我这样做: 我首先搜索文档,为返回的结果设置更大的限制(比方说,大小:10000)。 对于每个返回的文档,我都会修改某些值。 我不喜欢对整个修改后的清单(批量索引)进行Elasticsearch。 该操作一直进行到点1不再返回结果为止。 当我删除时,我这样做: 我首先搜索文档,为返回结果设置更大的限制(例如,大小:10000) 我删除所有找到的发

  • 问题内容: 考虑2个或更多表: 我希望删除所有与名字“ Sam ”匹配的 用户 及其 订单 。在mysql中,我通常会做左连接。在此示例中,我们不知道userid。 查询的正确格式是什么? 问题答案: http://www.postgresql.org/docs/current/static/sql- delete.html 您也可以使用 http://www.postgresql.org/doc

  • 问题内容: 我想一次删除多个数据库条目。仅当3个字段匹配时(此处为:姓名,电子邮件,年龄),才能删除每个条目。 如果我只想删除一个属性,则可以选择: 但是,如果我的病情是由多个领域构成的,那该怎么办? 条件应始终匹配所有3个字段()! 问题答案: 使用方法。

  • 问题内容: 我想做这样的事情: 我怎样才能做到这一点? 问题答案: 如果必须选择ID: 如果您已经知道它们(并且它们不在成千上万):