有关sed正则表达式的帮助:从特定标记中提取文本

时间:2010-01-27 18:27:54

标签: html xml regex sed grep

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

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

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

我想使用sed regex在<Tag2>之间提取文本,可能还会出现其他<Tag2>,我也想提取这些文本。

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

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

给出输出:

 not working

任何人都知道如何让这个工作?

4 个答案:

答案 0 :(得分:4)

正如另一张海报所说,sed可能不是这项工作的最佳工具。您可能希望使用为XML解析构建的东西,甚至是一种简单的脚本语言,例如perl。

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

cat test_file很好 - 它将文件的内容打印到stdout。

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

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

您可以尝试以下内容:

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

这将产生

working

但它只适用于一个标签对。

答案 1 :(得分:4)

对于你友善的例子,你可以使用

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

但那里的XML是残忍和漠不关心的。您正在使用正则表达式来刮取XML时遇到严重问题。

答案 2 :(得分:0)

你可以使用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

答案 3 :(得分:0)

awk -F"Tag2" '{print $2}' test_1 | sed 's/[^a-zA-Z]//g'