首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >删除括号()中不存在的字符串?

删除括号()中不存在的字符串?
EN

Stack Overflow用户
提问于 2014-12-20 11:20:10
回答 3查看 57关注 0票数 1

我有一个包含如下数据的文件,我想删除括号中不存在的数据。

代码语言:javascript
复制
 hello (welcome) to chennai (hai)
 hello (how) this is for testing (with) 
 [is] this (bhuvanesh)    

我要输出如下所示

代码语言:javascript
复制
(welcome) (hai)
 (how) (with)
 (bhuvanesh)
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-12-20 11:31:57

您可以使用以下sed命令:

代码语言:javascript
复制
sed 's/[^(]*\(([^)]\+)\)[^(]*/\1/g' input.txt

解释:

我在用替代命令。在它的基本形式中,它看起来如下:

代码语言:javascript
复制
s/SEARCH/REPLACE/g

结束时的g意味着全局的,而sed应该取代所有SEARCH的出现,而不仅仅是第一次。

SEARCH模式如下所示:

代码语言:javascript
复制
[^(]*\(([^)]\+)\)[^(]*

我试着一步一步地解释.

代码语言:javascript
复制
[^(]*

[]是一个字符类,开头的^表示类中列出的字符不应该匹配。我们只列出一个字符--开始括号(*意味着这可能发生0次或更多次。在一个句子中,sed在第一个开始括号(之前搜索所有字符。

代码语言:javascript
复制
\(([^)]\+)\)

(...)是一个匹配组。在基本的sed语言中,它需要转义:\(...\)。匹配组中的第一个字符是开头括号(。下面是一个字符类[^)]。它匹配除结束括号)以外的每个字符。量词\+意味着输入文本中的括号之间必须至少有一个字符,如果要允许空的内容,需要在这里使用*作为量词。它在结束括号)和匹配组\)的末尾之后。

通过使用匹配组,匹配的内容现在可以通过\1获得。

搜索模式的最后一部分与第一部分相同:

代码语言:javascript
复制
[^(]*

它匹配所有的东西,直到下一个括号。

REPLACE模式很简单。它丢弃了除了匹配组\1的内容之外的所有内容。

票数 2
EN

Stack Overflow用户

发布于 2014-12-20 11:30:21

这个awk可以做到:

代码语言:javascript
复制
awk -F"[()]" '{for (i=2;i<=NF;i+=2) printf "(%s) ",$i;print ""}' file
(welcome) (hai)
(how) (with)
(bhuvanesh)

或者像这样:

代码语言:javascript
复制
awk -F"[()]" '{for (i=2;i<=NF;i+=2) printf "%s ",$i;print ""}' file
welcome hai
how with
bhuvanesh
票数 0
EN

Stack Overflow用户

发布于 2014-12-20 12:49:41

试试这个。

sed -r 's/\[.*\][^(]*//g ; s/.*(\(.*\)).*(\(.*\))/\1\2/g'

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

https://stackoverflow.com/questions/27579684

复制
相关文章

相似问题

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