7

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

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

这将是结果列表:

text
words
123

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

4

5 回答 5

18

你可以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

高温高压

于 2012-05-19T02:42:45.910 回答
6

使用 GNU grep,您可以使用与 perl 兼容的正则表达式和环视断言来排除括号:

grep -Po '(?<=\().*?(?=\))' file.txt | sort -u
于 2012-05-19T09:49:23.640 回答
3

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

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

sed脚本应该去掉括号。这是针对 GNU grep 测试的,但是 BSD sed 所以要小心。

于 2012-05-19T02:00:26.660 回答
2

要重现您的列表:

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

要编译唯一词列表,您需要进一步处理该列表:

cat file.txt | sed  's/.*(\(.*\)).*/\1/' | sort | uniq
于 2012-05-19T02:05:53.500 回答
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 命令,以从上面的输出中给出唯一的单词。希望这个解释有所帮助。

于 2012-05-20T17:42:58.703 回答