我在html文件中有一行,我使用
grep -m 1 'argument'那条线看起来很像这样
<tag option="something" option="something"><span option="something"> Text1 </span> - <span option="something"> Text2 </span></tag> 我需要使用分隔行提取文本1和文本2,我该怎么办?我明白了,我需要使用sed,我已经删除了标签和跨度在乞讨时离开了我
Text1 </span> - <span...........</tag>但是我只需要Text1,我真的不知道如何删除非静态的Text2。
发布于 2013-12-27 11:05:46
--如果行始终与所提供的示例完全相同,则可以使用regexp执行。
但是在所有其他情况下,您确实应该使用XML解析器(例如,使用perl : twig或其他)。
这是一个regexp,但是你已经被警告了^^
#replace each <...> with "|", so you can easily separate each fields
sed -e 's/<[^>]*>/|/g' 然后,您可以使用新的“简单”分隔符|来获取每个部分。
grep 'argument' | sed -e 's/<[^>]*>/|/g' | awk -F'|' '{print $3}' #shows Text1. Change $3 to $5 to fetch the Text2发布于 2013-12-27 23:37:07
下面是使用grep和perl正则表达式的更短的实现方法。
$ cat testfile # I've placed your line in this file
<tag option="something" option="something"><span option="something"> Text1 </span> - <span option="something"> Text2 </span></tag> $ grep -Po '<span[^>]*>\K[^<]*' testfile
Text1
Text2 但是,如果您想得到精确的Text1和Text2,则需要更复杂的regexp。下面是:
$ grep -Po '<span[^>]*>( )?\s*\K.*?(?=\s*( )?</span>)' testfile
Text1
Text2一些解释:
此正则表达式使用lookaround语法或zero-width assertions。你可以在这里读到
\K可能也不熟悉。它与零宽度断言非常相似,并对这里作了很大解释。以下是该链接的引文:
这个构造有一种特殊的形式,称为\K,它使regex引擎“保留”它在\K之前匹配的所有内容,而不包括在$&中。这有效地提供了可变长度的后视镜。允许在另一个回顾性断言中使用\K,但该行为目前还没有很好地定义。
好吧,但为什么?
这种方法最重要的一点是,您已经在使用grep了,您可以将这个正则表达式与您的搜索模式结合起来,所以您只需要一个grep命令,而不是使用grep、sed和awk的奥利维尔的回答。
但是仍然有解析xml的特殊工具,请使用它们来代替这个regexA片。
https://stackoverflow.com/questions/20799366
复制相似问题