我在html文件中有一行,我找到了
grep -m 1 'argument'
这条线看起来很像这个
<tag option="something" option="something"><span option="something"> Text1 </span> - <span option="something"> Text2 </span></tag>
我需要使用单独的行提取Text 1和Text 2,我该怎么办?我得到了我需要使用sed,我已经删除了标签和跨度,让我留下了
Text1 </span> - <span...........</tag>
但我只需要Text1,我真的不知道如何删除那个非静态的Text2
答案 0 :(得分:1)
如果这些行看起来与您提供的示例完全相同,则可以使用正则表达式执行此操作。
但在所有其他情况下,您应该使用XML解析器(例如,使用perl:twig或其他)
所以这是一个正则表达式,但你已被警告^^
#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
答案 1 :(得分:0)
使用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
,你需要更复杂的正则表达式。这是:
$ grep -Po '<span[^>]*>( )?\s*\K.*?(?=\s*( )?</span>)' testfile
Text1
Text2
此正则表达式使用lookaround
语法或zero-width assertions
。 You can read about it here
\K
也可能不熟悉。它与零宽度断言非常相似,并且有很大的解释here。以下是该链接的引用:
这种结构有一种特殊形式,称为\ K,它使正则表达式引擎“保留”它在\ K之前匹配的所有内容,而不是将它包含在$&amp; 。这有效地提供了可变长度的后视。允许在另一个环视断言中使用\ K,但目前行为尚未明确定义。
这种方法中最重要的一点是你已经在使用grep了,你可以将这个正则表达式与你的搜索模式结合起来,所以你只需要一个grep
命令,这与Oliver`s answer不同。使用grep
,sed
和awk
但仍然有解析xml的特殊工具,请使用它们代替此正则表达式色情内容。