GREP はパターンを検索し、パターンの前後のすべてのガベージ文字を削除します。

GREP はパターンを検索し、パターンの前後のすべてのガベージ文字を削除します。

ディレクトリにファイルセットがあります。各ファイルには---PUBG-xxxxx--またはという行があります---PUBG-xxxxx, PUBG-yyyyy ----。以下はgrepコマンドの出力です。

grep "^--" FILE*.sql | grep "PUBG"

FILE1.sql:---PUBG-10901--
FILE2.sql:---PUBG-11617--
FILE3.sql:---PUBG-11625--
FILE4.sql:--PUBG-11724--
FILE5.sql:---PUBG-11720, PUBG-11406---
FILE6.sql:---PUBG-11403---
FILE7.sql:---PUBG-12021--
FILE8.sql:---PUBG-12207--
FILE9.sql:---PUBG-12270--
FILE10.sql:---PUBG-12552--
FILE11.sql:--- PUBG-14284--
FILE12.sql:--- PUBG-10908--
FILE13.sql:--- PUBG-15136---
FILE14.sql:--- PUBG-15163---
FILE15.sql:--- PUBG-15166---
FILE16.sql:-- PUBG-15059 --
FILE17.sql:-- PUBG-15252 --

PUBGとその番号はランダムに指定されます。私にとって必要なのは、ファイル名と関連するPUBG値だけであり、--PUBGとその値の前後ではありません。FILE5.sql:---PUBG-11720, PUBG-11406---次のようなforループセットを作成しました。

for (i in `grep "^--" FILE*.sql | grep "PUBG"`)
do
    FILE_NAME=`echo ${i} |  awk -F ":" {'print $1'}`
    PUBG_NO=`echo ${i} | awk -F "PUBG-" {'print "PUBG-" $2'}`
    echo ${FILE_NAME}
    echo ${PUBG_NO}
done

ただし、サンプル出力PUBG_NOPUBG-15166---forFILE15.sqlPUBG-11720,ですFILE5.sql

ファイル内の特定のFILE_NAMEのすべてのPUBG値が必要です。FILE5.sqlの.PUBG値は、正確な結果を得るためにこのループを改善する方法にすることが--できます。PUBG-11720, PUBG-11406

ベストアンサー1

ループを書く必要はありません。出力をsedにパイプできます。私の試みは次のとおりです。

grep "^--" FILE*.sql | grep "PUBG" | sed -E 's/--+\ ?//g'

これは与える

FILE1.sql:PUBG-10901
FILE2.sql:PUBG-11617
FILE3.sql:PUBG-11625
FILE4.sql:PUBG-11724
FILE5.sql:PUBG-11720, PUBG-11406
FILE6.sql:PUBG-11403
FILE7.sql:PUBG-12021
FILE8.sql:PUBG-12207
FILE9.sql:PUBG-12270
FILE10.sql:PUBG-12552
FILE11.sql:PUBG-14284
FILE12.sql:PUBG-10908
FILE13.sql:PUBG-15136
FILE14.sql:PUBG-15163
FILE15.sql:PUBG-15166
FILE16.sql:PUBG-15059 
FILE17.sql:PUBG-15252 
FILE14.sql:PUBG-15163
FILE15.sql:PUBG-15166
FILE16.sql:PUBG-15059 
FILE17.sql:PUBG-15252 

ここでは、次の形式のsed代替コマンドを使用しています。

's/regular expression/substition/flag'

コマンドをさらに詳しく分析すると、次のようになります。

  • 正規表現 "--+\?" は検索して選択したいパターンです。これは、「-」の後に1つ以上の連続した「-」が続き、その後にゼロまたは1つの「」が続くパターン検索で読み取ることができます。これは「--」、「---」、および「-」と一致します。 - "出力に。これらの数量子を認識するには、sedの-Eフラグが必要です。次は?および+などの正規表現数量子を確認するためのクイックリファレンス。
  • ここでは交換空間を空にしておきました。これは、見つかったパターンをヌルに置き換えて出力を削除する効率的な方法です。
  • フラグ「g」は、検索がグローバルであることを示す。これがない場合、置換は各行の最初の一致でのみ発生します。 gを追加すると、すべての行にあるパターンのすべてのインスタンスが何でも置き換えられます。

また、これらの概念を初期のgrepコマンドに適用して、単一の検索のみを実行することもできます。

grep -E "^--+\ ?PUBG" FILE*.sql | sed -E 's/--+\ ?//g'

おすすめ記事