web-dev-qa-db-ja.com

パターンに一致する単一の文字列から単語をgrepする方法は?

誰かが私に以下の単一の文字列からパターン_ARAを含む単語のみをgrepするように案内しますか?.

ストリング:

LINK:['IM219MIR_ARA1','IM18Q4_ARA1','SM18Q4_ARA1','IM18PLANNING_ARA1','IM118Q4DYNVA_ARA1','IM218Q4DYNVA_ARA1','IM119EIOPALTG_ARA1','IM219EIOPALTG_ARA1','SM119EIOPALTG_ARA1']}

予想される出力:

IM219MIR_ARA1
IM18Q4_ARA1
SM18Q4_ARA1
IM18PLANNING_ARA1
IM118Q4DYNVA_ARA1
IM218Q4DYNVA_ARA1
IM119EIOPALTG_ARA1
IM119EIOPALTG_ARA1
IM219EIOPALTG_ARA1
SM119EIOPALTG_ARA1
6
ptmjyothish

grep-oを受け入れ、一致が同じ行からのものであっても、別の行に一致するテキストのみを印刷します。また、-wを受け入れて、正規表現がWord全体と一致する(またはまったく一致しない)ことを強制します。Wordは、文字、数字、およびアンダースコアの最大のシーケンスです。だからあなたは単に使うことができます:

grep -ow '\w*_ARA\w*'

この場合、必要に応じて実際に-wオプションを省略して同じ結果を得ることができます。これは、ここでの正規表現がWord文字のみを\wと明示的に照合しているためです。

ファイル名引数がないため、標準入力から読み取ります。表示したテキストがファイル内にある場合(たとえば、input.txtと呼ばれます)、引数として渡します。

grep -ow '\w*_ARA\w*' input.txt

これは出力します:

IM219MIR_ARA1
IM18Q4_ARA1
SM18Q4_ARA1
IM18PLANNING_ARA1
IM118Q4DYNVA_ARA1
IM218Q4DYNVA_ARA1
IM119EIOPALTG_ARA1
IM219EIOPALTG_ARA1
SM119EIOPALTG_ARA1

技術的に、これが生成する出力は、質問で示したものとは少し異なります。これは、表示した期待される出力は、表示したテキストに1回しか表示されない場合でもIM119EIOPALTG_ARA1が2回リストされるためです。これは間違いだと思いますが、実際には1回だけ必要です。

9
Eliah Kagan

cutコマンドとsedコマンドを使用する場合は、次のコマンドを使用します。

<test.txt cut -d'[' -f2 | cut -d']' -f1 | sed "s/,'/\\n/g" | sed 's/.$//' | cut -d\' -f2 | grep _ARA

2部構成の説明:

  • grep _ARAは、フィルタリングする必要がある行を検索します
  • cut -d'[' -f2は、単語の前の文字を削除します。cut -d']' -f1の場合も同様で、後の文字が削除されます
  • sed "s/,'/\\n/g"は、各単語を1行で抽出します
  • <test.txtcutおよびgrepコマンドの単なるリダイレクトです

この4つの前のコマンドの後、結果は次のとおりです。

'IM219MIR_ARA1'
IM18Q4_ARA1'
SM18Q4_ARA1'
IM18PLANNING_ARA1'
IM118Q4DYNVA_ARA1'
IM218Q4DYNVA_ARA1'
IM119EIOPALTG_ARA1'
IM219EIOPALTG_ARA1'
SM119EIOPALTG_ARA1'

したがって、各単語の終わりにある'を削除するには、次のように追加します

sed 's/.$//'

最初の'には、

cut -d\' -f2

したがって、最終結果は次のとおりです。

IM219MIR_ARA1
IM18Q4_ARA1
SM18Q4_ARA1
IM18PLANNING_ARA1
IM118Q4DYNVA_ARA1
IM218Q4DYNVA_ARA1
IM119EIOPALTG_ARA1
IM219EIOPALTG_ARA1
SM119EIOPALTG_ARA1

このコマンドの詳細が必要な場合は、 Eliah Kagan を使用して私の説明を読むことができます。

4
damadam