使用BASH sed命令剥离线
我在html文件中有一行,我使用使用BASH sed命令剥离线,bash,sed,Bash,Sed,我在html文件中有一行,我使用 grep -m 1 'argument' 那条线看起来很像这样 <tag option="something" option="something"><span option="something"> Text1 </span> - <span option="something"> Text2 </span></tag> Text1-Text2
grep -m 1 'argument'
那条线看起来很像这样
<tag option="something" option="something"><span option="something"> Text1 </span> - <span option="something"> Text2 </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"> Text1 </span> - <span option="something"> Text2 </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"> Text1 </span> - <span option="something"> Text2 </span></tag>
$ grep -Po '<span[^>]*>\K[^<]*' testfile
Text1
Text2
$ grep -Po '<span[^>]*>( )?\s*\K.*?(?=\s*( )?</span>)' testfile
Text1
Text2