【问题标题】:sed substitution on multiple lines多行上的 sed 替换
【发布时间】:2020-11-03 22:03:30
【问题描述】:

我需要将以下文本中的 owl:Class 替换为 LP 编号

Input

<owl:Class rdf:about="https://loinc.org/LP173100-1">
        <rdfs:subClassOf rdf:resource="https://loinc.org/LP410935-3"/>
        <rdfs:label rdf:datatype="http://www.w3.org/2001/XMLSchema#string">Counseling (LP)</rdfs:label>
        <skos:prefLabel rdf:datatype="http://www.w3.org/2001/XMLSchema#string">Counseling</skos:prefLabel>
        <loinc:hasCode rdf:datatype="http://www.w3.org/2001/XMLSchema#string">LP173100-1</loinc:hasCode>
    </owl:Class>

这样替换后的输出如下所示

Output

<LP173100-1 rdf:about="https://loinc.org/LP173100-1">
        <rdfs:subClassOf rdf:resource="https://loinc.org/LP410935-3"/>
        <rdfs:label rdf:datatype="http://www.w3.org/2001/XMLSchema#string">Counseling (LP)</rdfs:label>
        <skos:prefLabel rdf:datatype="http://www.w3.org/2001/XMLSchema#string">Counseling</skos:prefLabel>
        <loinc:hasCode rdf:datatype="http://www.w3.org/2001/XMLSchema#string">LP173100-1</loinc:hasCode>
    </LP173100-1>

我在第一行使用了s/\(owl:Class\)\(.*org\/\)\(LP.*\)"/\3\2\3/g,但我不知道如何在最后一行应用它。有没有更优雅的解决方案?我有一个巨大的文件,我需要在其中进行此类替换。

我使用的是 Centos OS 7.7 Linux 机器。

【问题讨论】:

  • 您是否尝试将 xml 节点中的标记名称替换为类似"LP173100-1" 的字符串?如果是这样,您应该知道 xml 标记名称周围不能有 "。也许您的意思是替换为LP173100-1
  • 您真的要为此使用sed 吗?使用 XML 工具可能会更容易、更健壮。
  • 可能还可以看到 meta.stackoverflow.com/questions/261561/…,它主要讨论 HTML,但同样广泛的推理当然适用于任何 XML 应用程序或任何结构化格式。
  • 在这种情况下,第 1 课:sed 不适用于 XML。
  • 完全同意@chepner:xml 和正则表达式就像油和水。使用 xidel 或 xmlstarlet 之类的东西。

标签: xml bash sed centos7


【解决方案1】:

您可以将\n 符号替换为其他符号(这样该符号不在文件内的任何其他位置),然后继续照常工作。

cat foo.txt | tr '\n' '\r' | sed -e 's/\(owl:Class\)\(.*org\/\)\(LP.*\)"/"\3"\2\3/g'  | tr '\r' '\n'

【讨论】:

  • 一些sed 变体在很长的行中会遇到问题。当然,丢掉丑陋的useless cat.
  • 无限的.* 将尽可能多地消耗字符串。明显未经测试而投反对票。
  • 问题是关于多行 sed 替换,表达式取自原始帖子。
  • 但是当一切都是单行时,该正则表达式将不再正常工作。如果 yowr sed 支持符号符号 \r ,则将其更改为 [^\r]* 将起作用;但很多人没有。您可以切换到 Perl 而不是 sed 以获得可移植性,但是 Perl 提供了许多非常出色的方法来解决问题而无需正则表达式。
猜你喜欢
  • 1970-01-01
  • 2010-11-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-19
  • 2011-01-23
  • 2021-02-18
相关资源
最近更新 更多