我有一个包含如下数据的文件,我想删除括号中不存在的数据。
hello (welcome) to chennai (hai)
hello (how) this is for testing (with)
[is] this (bhuvanesh) 我要输出如下所示
(welcome) (hai)
(how) (with)
(bhuvanesh)发布于 2014-12-20 11:31:57
您可以使用以下sed命令:
sed 's/[^(]*\(([^)]\+)\)[^(]*/\1/g' input.txt解释:
我在用替代命令。在它的基本形式中,它看起来如下:
s/SEARCH/REPLACE/g结束时的g意味着全局的,而sed应该取代所有SEARCH的出现,而不仅仅是第一次。
SEARCH模式如下所示:
[^(]*\(([^)]\+)\)[^(]*我试着一步一步地解释.
[^(]*[]是一个字符类,开头的^表示类中列出的字符不应该匹配。我们只列出一个字符--开始括号(。*意味着这可能发生0次或更多次。在一个句子中,sed在第一个开始括号(之前搜索所有字符。
\(([^)]\+)\)(...)是一个匹配组。在基本的sed语言中,它需要转义:\(...\)。匹配组中的第一个字符是开头括号(。下面是一个字符类[^)]。它匹配除结束括号)以外的每个字符。量词\+意味着输入文本中的括号之间必须至少有一个字符,如果要允许空的内容,需要在这里使用*作为量词。它在结束括号)和匹配组\)的末尾之后。
通过使用匹配组,匹配的内容现在可以通过\1获得。
搜索模式的最后一部分与第一部分相同:
[^(]*它匹配所有的东西,直到下一个括号。
REPLACE模式很简单。它丢弃了除了匹配组\1的内容之外的所有内容。
发布于 2014-12-20 11:30:21
这个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发布于 2014-12-20 12:49:41
试试这个。
sed -r 's/\[.*\][^(]*//g ; s/.*(\(.*\)).*(\(.*\))/\1\2/g'
https://stackoverflow.com/questions/27579684
复制相似问题