ディレクトリにファイルセットがあります。各ファイルには---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_NO
はPUBG-15166---
forFILE15.sql
とPUBG-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'