【问题标题】:Regular expression to extract text from XML-ish data using GNU sed使用 GNU sed 从 XML-ish 数据中提取文本的正则表达式
【发布时间】:2013-08-09 01:57:18
【问题描述】:

我有一个文件,其中包含使用“gsed regexp -i FILENAME”从 XML 文件中提取的行。文件中的行都是其中一种格式:

<field number='1' name='Account' type='STRING'W/>

<field number='2' name='AdvId' type='STRING'W>

我在末尾插入了一个“W”,代表可选的空格。尽管“number”总是在“type”之前,但文件中所有行的属性顺序和数量不一定相同。

我正在搜索的是一个正则表达式“regexp”,我可以将它提供给 gnu sed,以便此命令:

gsed 正则表达式 -i 文件名

给我一​​个文件,其行如下所示:

1 个字符串

2 个字符串

我不关心结果中的空白数量,只要在数字后面有一些空格并且每行末尾有一个换行符。

我确信这是可能的,但我只是无法在合理的时间内弄清楚如何。有人可以帮忙吗?

非常感谢, 朱尔斯

【问题讨论】:

  • 我实际上忽略了它。我赞成你的回答,因为它给了我我所要求的以及来自 choroba 的 xsh 解决方案,因为虽然它并没有真正回答问题,但它确实指出了一个优雅的问题解决方案。

标签: regex bash sed


【解决方案1】:

我认为使用命令行 XML 工具(例如 XMLStarlet)会更好地。这将与 shell 很好地集成,并让您执行 XPath 搜索。它支持 XML,因此可以正确处理字符编码、空格等。

【讨论】:

    【解决方案2】:

    我确信这可以优化,但它适用于我并回答你的问题:

     sed "s/^.*number='\([0-9]*\)'.*type='\(.*\)'.*$/\1 \2/" <filename>
    

    这么说,我认为其他人是对的,如果你有一个 XML 文件,你应该使用一个 XML 解析器。

    【讨论】:

      【解决方案3】:

      使用xsh,一个围绕XML::LibXML 的Perl 包装器:

      open file.xml ;
      for //field echo @number @type ;
      

      【讨论】:

        【解决方案4】:

        简单的剪裁应该适合你:

        cut -f2,6 -d"'" --output-delimiter=""

        如果你真的想要 sed:

        sed -r "s/.'(.)'.type='(.)'.*/\1 \2/"

        【讨论】:

          【解决方案5】:

          你可以用这个:

          sed -r "s/<field [^>]*?number='([0-9]+)'[^>]*?type='([^']+)'[^>]*>/\1 \2/"
          

          【讨论】:

            【解决方案6】:

            最好使用 XML 解析器,但如果必须使用 sed:

            sed 's/&lt;field number=\'(.*?)\'.*?type=\'(.*?)\'/\1 \2

            【讨论】:

              【解决方案7】:
              sed -ni "/<field .*>/s@^.*[[:space:]]number='\\([^']\\+\\).*[[:space:]]type='\\([^']\\+\\).*@\1 \2@p" FILENAME
              

              或者,如果您不介意数字和类型的内容是可选的:

              sed -ni "/<field .*>/s@^.*[[:space:]]number='\\([^']*\\).*[[:space:]]type='\\([^']*\\).*@\1 \2@p" FILENAME
              

              只需根据您的喜好将[^']\\+ 更改为[^']*

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2021-11-26
                • 1970-01-01
                • 2015-09-17
                • 2017-10-08
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多