第一次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
任何人都知道如何让这个工作?
答案 0 :(得分:4)
正如另一张海报所说,sed可能不是这项工作的最佳工具。您可能希望使用为XML解析构建的东西,甚至是一种简单的脚本语言,例如perl。
您尝试的问题是您没有正确分析字符串。
cat test_file
很好 - 它将文件的内容打印到stdout。
grep -i "Tag2"
没问题 - 它只打印出带有“Tag2”的行。这可能不是你想要的。请记住,它将打印整个行,而不仅仅是&lt; Tag2&gt;行。部分,所以你仍然需要稍后搜索该部分。
sed 's/<[^>]*[>]//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'