行からキーワードを抽出

行からキーワードを抽出

以下のデータから同様のパターンを抽出する必要があります。パターンは「.」で始まります。または「次に私が欲しいキーワード、次に」'。形式は次のように仮定できます。

  1. LSUFE-番号_
  2. PCRF-番号_

サンプル

/home/mobaxterm/Data/FW/FW3/FW.3.1/releases/patch_PCRF-17717B1.jar,patch_PCRF-17717B1.jar,yschew,2015-10-21 11:31:58.000000000,patch
/home/mobaxterm/Data/FW/FW9/CW.1/releases/D/patch_FW_9.3.1.LSUFE-583B1_i86pc.jar,patch_FW_9.3.1.LSUFE-583B1_i86pc.jar,yschew,2015-10-21 11:31:58.000000000,patch,i86pc

希望の出力

LSUFE-583B1
PCRF-17717B1

私はの答えを使ってみました。 https://stackoverflow.com/questions/8777901/extract-special-words-from-a-line

sed -r 's/.*LSUFE-(\S+).*/\1/'

しかし、うまくいきません。空の画面のみが表示されます。今私は次のことをするつもりです。

sed -e 's/LSUFE-*/,/\_/' output.txt

しかし、もちろん、私はそれを動作させませんでした。アンダースコアが現れるまで、一致するパターンを読み、各パターンを1つずつ処理するのがアイデアでした。

ベストアンサー1

次のように使用できます。

$ grep -oE '(LSUFE|PCRF)-[^._]*' input.txt  | uniq
PCRF-17717B1
LSUFE-583B1

これはuniq、各行にパッチファイル名のフルパスとデフォルト名が含まれているために必要です(つまり、パスなし)。

または、出力順序が重要でない場合はsort -u代わりに使用できますuniq。これにより、複数の行に表示される重複項目も削除されます。

Perlの代替案は次のとおりです。

perl -F, -a -e 'next unless $F[1] =~ s/.*((LSUFE|PCRF)-[^._]*).*/$1/  ; print $F[1],"\n"' input.txt

これはフィールド2でのみ正規表現の検索と置換を実行し($F[1]perl配列は0から始まる)、フィールド2を印刷します。

このバージョンの Perl は、一致するテキストを入力行の末尾に追加フィールドとして追加します。

perl -F, -a -e 'chomp ; next unless $F[1] =~ s/.*((LSUFE|PCRF)-[^._]*).*/$1/ ; print $_,",",$F[1],"\n"' input.txt 

入力行からchomp()末尾を削除して\nから、入力行($_)、カンマ、変更されたフィールド2、および改行文字を印刷するために使用されます。

おすすめ記事