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

时间:2014-12-20 11:20:11

标签: sed

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

 hello (welcome) to chennai (hai)
 hello (how) this is for testing (with) 
 [is] this (bhuvanesh)    

我希望输出如下

(welcome) (hai)
 (how) (with)
 (bhuvanesh)

3 个答案:

答案 0 :(得分:2)

您可以使用以下sed命令:

sed 's/[^(]*\(([^)]\+)\)[^(]*/\1/g' input.txt

<强>解释

我使用了substitute命令。在它的基本形式中,它看起来像这样:

s/SEARCH/REPLACE/g

g表示全局,意味着sed应该重新放置SEARCH的所有出现,而不仅仅是第一次出现。

SEARCH模式如下所示:

[^(]*\(([^)]\+)\)[^(]*

我会一步一步地解释它......

[^(]*

[]是一个字符类,开头的^表示类中列出的字符匹配。我们只列出一个字符 - 左括号(*表示可以发生零次或多次。在一个句子中,sed在第一个起始括号(之前搜索所有字符。

\(([^)]\+)\)

(...)是匹配组。在基本的sed语言中,它需要被转义:\(...\)。匹配组中的第一个字符是左括号(。字符类[^)]正在跟随。它匹配除右括号)之外的每个字符。量词\+表示输入文本中的括号内必须至少有一个字符,如果您想允许空内容,则需要在此处使用*作为量词。它遵循右括号)和匹配组\)的结尾..

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

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

[^(]*

它匹配所有内容,直到下一个左括号。

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

答案 1 :(得分:0)

awk会:

awk -F"[()]" '{for (i=2;i<=NF;i+=2) printf "(%s) ",$i;print ""}' file
(welcome) (hai)
(how) (with)
(bhuvanesh)

或者像这样:

awk -F"[()]" '{for (i=2;i<=NF;i+=2) printf "%s ",$i;print ""}' file
welcome hai
how with
bhuvanesh

答案 2 :(得分:0)

试试这个。

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