使用BASH sed命令去除一条线

时间:2013-12-27 10:52:36

标签: bash sed

我在html文件中有一行,我找到了

 grep -m 1 'argument'

这条线看起来很像这个

<tag option="something" option="something"><span option="something">&nbsp;Text1 </span> - <span option="something"> Text2&nbsp;</span></tag> 

我需要使用单独的行提取Text 1和Text 2,我该怎么办?我得到了我需要使用sed,我已经删除了标签和跨度,让我留下了

   Text1 </span> - <span...........</tag>

但我只需要Text1,我真的不知道如何删除那个非静态的Text2

2 个答案:

答案 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">&nbsp;Text1 </span> - <span option="something"> Text2&nbsp;</span></tag> 

$ grep -Po '<span[^>]*>\K[^<]*' testfile
&nbsp;Text1 
 Text2&nbsp;

但是如果你想准确得到Text1Text2,你需要更复杂的正则表达式。这是:

$ grep -Po '<span[^>]*>(&nbsp;)?\s*\K.*?(?=\s*(&nbsp;)?</span>)' testfile
Text1
Text2

一些解释:

此正则表达式使用lookaround语法或zero-width assertionsYou can read about it here

\K也可能不熟悉。它与零宽度断言非常相似,并且有很大的解释here。以下是该链接的引用:

  

这种结构有一种特殊形式,称为\ K,它使正则表达式引擎“保留”它在\ K之前匹配的所有内容,而不是将它包含在$&amp; 。这有效地提供了可变长度的后视。允许在另一个环视断言中使用\ K,但目前行为尚未明确定义。

好的,但为什么?

这种方法中最重要的一点是你已经在使用grep了,你可以将这个正则表达式与你的搜索模式结合起来,所以你只需要一个grep命令,这与Oliver`s answer不同。使用grepsedawk 仍然有解析xml的特殊工具,请使用它们代替此正则表达式色情内容。