【问题标题】:Help with sed regex: extract text from specific tag帮助 sed 正则表达式:从特定标签中提取文本
【发布时间】:2011-01-10 02:22:19
【问题描述】:

第一次sed'er,所以要温柔。

我有以下文本文件,'test_file':

 <Tag1>not </Tag1><Tag2>working</Tag2>

我想使用 sed 正则表达式提取 &lt;Tag2&gt; 之间的文本,可能还有其他出现的 &lt;Tag2&gt; 我也想提取那些。

到目前为止,我有这个基于 sed 的正则表达式:

cat test_file | grep -i "Tag2"| sed 's/<[^>]*[>]//g'

给出输出:

 not working

有人知道如何让它工作吗?

【问题讨论】:

  • 从您所写的内容来看,我猜您只需要 Tag2 标签之间的文本。那是对的吗?如果是这样,你知道 cat test_file | 是什么吗? grep -i "Tag2" 输出?
  • 很抱歉这么说,但是发布 链接 以回应一个 regex+(x)html 相关问题而不提供任何更多信息,这可能与问题本身一样令人厌烦。仔细想想,更是如此。这相当于发布臭名昭著的名言“程序员 bla bla bla 问题 couch 正则表达式 gulp 有两个问题!”。如果你有一种无法控制的发布链接的冲动,至少给原始发布者一个暗示,表明他/她将要做什么并不是最好的解决方案。

标签: html xml regex sed grep


【解决方案1】:

正如另一位发帖人所说,sed 可能不是这项工作的最佳工具。您可能想要使用为 XML 解析而构建的东西,甚至是简单的脚本语言,例如 perl。

您尝试的问题是您没有正确分析字符串。

cat test_file 很好 - 它将文件的内容打印到标准输出。

grep -i "Tag2" 没问题 - 它只打印出带有“Tag2”的行。这可能不是您想要的。请记住,它将打印 整个 行,而不仅仅是 部分,因此您稍后仍需搜索该部分。

sed 's/&amp;lt;[^&amp;gt;]*[&amp;gt;]//g' 不是您想要的 - 它只是删除标签,包括

你可以试试这样的:

cat tmp.tmp | grep -i tag2 | sed 's/.*<Tag2>\(.*\)<\/Tag2>.*/\1/'

这会产生

working

但它只适用于一对标签。

【讨论】:

  • +1 表示 NOT 发布 链接 并耐心回答问题并警告这不是问题的一般解决方案。
【解决方案2】:

对于您的友好示例,您可以使用

sed -e 's/^.*<Tag2>//' -e 's!</Tag2>.*!!' test-file 

但是那里的 XML 是残酷和无情的。您在使用正则表达式来抓取 XML 时遇到了严重的麻烦。

【讨论】:

  • +1 表示 NOT 发布 链接 并耐心回答问题并警告这不是问题的一般解决方案。
【解决方案3】:

你可以使用 gawk,例如

$ cat file
 <Tag1>not </Tag1><Tag2>working here</Tag2>
 <Tag1>not </Tag1><Tag2>
working

</Tag2>

$ awk -vRS="</Tag2>" '/<Tag2>/{gsub(/.*<Tag2>/,"");print}' file
working here

working

【讨论】:

    【解决方案4】:
    awk -F"Tag2" '{print $2}' test_1 | sed 's/[^a-zA-Z]//g'
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-10-11
      • 2018-05-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-14
      相关资源
      最近更新 更多