首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用BASH命令删除一行

使用BASH命令删除一行
EN

Stack Overflow用户
提问于 2013-12-27 10:52:35
回答 2查看 523关注 0票数 0

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

代码语言:javascript
复制
 grep -m 1 'argument'

那条线看起来很像这样

代码语言:javascript
复制
<tag option="something" option="something"><span option="something">&nbsp;Text1 </span> - <span option="something"> Text2&nbsp;</span></tag> 

我需要使用分隔行提取文本1和文本2,我该怎么办?我明白了,我需要使用sed,我已经删除了标签和跨度在乞讨时离开了我

代码语言:javascript
复制
   Text1 </span> - <span...........</tag>

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-12-27 11:05:46

--如果行始终与所提供的示例完全相同,则可以使用regexp执行。

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

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

代码语言:javascript
复制
#replace each <...> with "|", so you can easily separate each fields
sed -e 's/<[^>]*>/|/g' 

然后,您可以使用新的“简单”分隔符|来获取每个部分。

代码语言:javascript
复制
grep 'argument' | sed -e 's/<[^>]*>/|/g' | awk -F'|' '{print $3}'  #shows Text1. Change $3 to $5 to fetch the Text2
票数 1
EN

Stack Overflow用户

发布于 2013-12-27 23:37:07

下面是使用grep和perl正则表达式的更短的实现方法。

代码语言:javascript
复制
$ 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> 
代码语言:javascript
复制
$ grep -Po '<span[^>]*>\K[^<]*' testfile
&nbsp;Text1 
 Text2&nbsp;

但是,如果您想得到精确的Text1Text2,则需要更复杂的regexp。下面是:

代码语言:javascript
复制
$ grep -Po '<span[^>]*>(&nbsp;)?\s*\K.*?(?=\s*(&nbsp;)?</span>)' testfile
Text1
Text2

一些解释:

此正则表达式使用lookaround语法或zero-width assertions你可以在这里读到

\K可能也不熟悉。它与零宽度断言非常相似,并对这里作了很大解释。以下是该链接的引文:

这个构造有一种特殊的形式,称为\K,它使regex引擎“保留”它在\K之前匹配的所有内容,而不包括在$&中。这有效地提供了可变长度的后视镜。允许在另一个回顾性断言中使用\K,但该行为目前还没有很好地定义。

好吧,但为什么?

这种方法最重要的一点是,您已经在使用grep了,您可以将这个正则表达式与您的搜索模式结合起来,所以您只需要一个grep命令,而不是使用grepsedawk奥利维尔的回答

但是仍然有解析xml的特殊工具,请使用它们来代替这个regexA片。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20799366

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档