如何找到括号之间出现的所有单词?

时间:2012-05-19 01:44:49

标签: bash grep

我有一个包含括号中的单词的文件。我想编制一份出现在那里的所有独特单词的列表,例如:

This is some (text).
This (text) has some (words) in parenthesis.
Sometimes, there are numbers, such as (123) in parenthesis too.

这将是结果列表:

text
words
123

如何列出括号内出现的所有项目?

5 个答案:

答案 0 :(得分:17)

您可以像这样使用awk

awk -F "[()]" '{ for (i=2; i<NF; i+=2) print $i }' file.txt

打印:

text
text
words
123

您可以使用数组打印唯一值:

awk -F "[()]" '{ for (i=2; i<NF; i+=2) array[$1]=$i; print array[$1] }' file.txt

打印:

text
words
123

HTH

答案 1 :(得分:5)

使用GNU grep,您可以使用带有环绕声断言的perl兼容正则表达式来排除parens:

grep -Po '(?<=\().*?(?=\))' file.txt | sort -u

答案 2 :(得分:3)

grep -oE '\([[:alnum:]]*?\)' | sed 's/[()]//g' | sort | uniq

  • -o仅打印匹配的文字
  • -E表示使用扩展正则表达式
  • \(表示匹配文字paren
  • [[:alnum:]]是字母和数字的POSIX字符类。

sed脚本应该删除parens。这是针对GNU grep测试的,但BSD因此要小心。

答案 3 :(得分:2)

要重现您的列表:

cat file.txt | sed  's/.*(\(.*\)).*/\1/'

要编制唯一字词列表,您需要进一步处理列表:

cat file.txt | sed  's/.*(\(.*\)).*/\1/' | sort | uniq

答案 4 :(得分:1)

你可以试试这个

 sed -e 's/\(/\n\(/g' -e 's/\)/\n/g' filename|awk -F'(' '{print $2}'|sort -u

阐释:

第一个sed语句将括号中的单词放在新行中,第二个sed用新行替换字符')'。所以在运行以下声明后

sed -e 's/\(/\n\(/g' -e 's/\)/\n/g' filename

输出看起来像这样

This is some 
(text
.This 
(text
has some 
(words
 in parenthesis.
Sometimes, there are numbers, such as 
(123
 in parenthesis too.

现在将此输出汇总到awk语句下面,该语句在过滤字符'('

之间打印第二个单词
awk -F'(' '{print $2}'

现在输出

text
text
words
123

上述输出通过管道传递给sort -u命令,以从上面的输出中提供唯一的单词。 希望这个解释有所帮助。