以下のデータから同様のパターンを抽出する必要があります。パターンは「.」で始まります。または「次に私が欲しいキーワード、次に」'。形式は次のように仮定できます。
- LSUFE-番号_
- 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、および改行文字を印刷するために使用されます。
答え2
キャプチャされた情報のみ
sed 's/.*\(LSUFE-\([^_.]*\)[_.].*/\1/' YourFile
,
区切り文字で最後にキャプチャが追加されました
sed 's/.*\(LSUFE-\([^_.]*\)[_.].*/&,\1/' YourFile
一度に複数のパターン
sed -e 's/.*\(LSUFE-\([^_.]*\)[_.].*/\1/' -e 's/.*\(PCRF-\([^_.]*\)[_.].*/\1/' YourFile
GNU sedの使用
sed 's/.*\(\(LSUFE\|PCRD\)-\([^_.]*\)[_.].*/\1/'