使用BASH sed命令剥离线

使用BASH sed命令剥离线,bash,sed,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> Text1-Text2

我在html文件中有一行,我使用

 grep -m 1 'argument'
那条线看起来很像这样

<tag option="something" option="something"><span option="something">&nbsp;Text1 </span> - <span option="something"> Text2&nbsp;</span></tag> 
Text1-Text2
我需要使用单独的行提取文本1和文本2,我该怎么做?我知道我需要使用sed,我已经删除了begginging的tag和span,给我留下了

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

Text1-如果行始终与您提供的示例完全相同,则可以使用regexp来完成

但在所有其他情况下,实际上应该使用XML解析器(例如,使用perl:twig或其他)

这是一个regexp,但是已经警告过你了^^

#replace each <...> with "|", so you can easily separate each fields
sed -e 's/<[^>]*>/|/g' 

下面是使用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> 
一些解释: 此正则表达式正在使用
lookaround
语法或
zero-width断言

\K
可能也不熟悉。它非常类似于零宽度断言,并且有很多解释。以下是该链接的一段引文:

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

好吧,但是为什么呢? 这种方法最大的优点之一是您已经在使用grep,您可以将这个正则表达式与您的搜索模式结合起来,这样您只需要一个
grep
命令,而不像使用
grep
sed
awk
命令那样

但是仍然有一些特殊的工具来解析xml,请使用它们而不是这个正则表达式色情。

工作非常完美,现在我需要重新阅读这篇文章来了解到底做了什么:D无论如何,谢谢!有一件事=它离开了,我想删除那些锯齿状命令的形式是
s/A/B/g
s
(搜索和替换),查找
A
,替换为
B
,而
g
表示“全局”,即不仅是每行的第一次出现,而且是在该行的所有出现中全局出现。然后,
]*>
是一个regexp,它匹配一个
]
(“除a>之外的任何内容),
*
是前面的内容“0、1或更多次”。因此它将匹配任何
[where
不包含
,否则它几乎会匹配整行,因为regexp试图覆盖尽可能多的内容]。因此,它将用
替换每个
,以删除任何内容:添加一个命令来删除它:
grep'argument'.-sed-e's/*\//g'-e's/]*>/\g''awk-F''''''''''''''''{print$3}“
:这也将消除行中的任何
[及其前后的任何空格],谢谢您的评论。我真的很感激,我用sed
's/\//g'
$ 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;
$ grep -Po '<span[^>]*>(&nbsp;)?\s*\K.*?(?=\s*(&nbsp;)?</span>)' testfile
Text1
Text2