我有一个文件,其中包含如下数据,我想删除不存在的数据 在括号中。
hello (welcome) to chennai (hai)
hello (how) this is for testing (with)
[is] this (bhuvanesh)
我希望输出如下
(welcome) (hai)
(how) (with)
(bhuvanesh)
答案 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'