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

HTH

于 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スクリプトは、parensを取り除く必要があります。これはGNUgrepに対してテストされていますが、BSDsedは注意が必要です。

于 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ステートメントは括弧内の単語を改行に配置し、2番目の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.

次に、この出力を、フィルター文字'('の間に2番目の単語を出力するawkステートメントの下にパイプします。

awk -F'(' '{print $2}'

出力は次のようになります

text
text
words
123

上記の出力は、sort -uコマンドにパイプされて、上記の出力から一意の単語を提供します。この説明がお役に立てば幸いです。

于 2012-05-20T17:42:58.703 に答える