Awk

模式的 GREP 並刪除模式之前或之後的所有垃圾字元

  • November 27, 2018

我在一個目錄中有一組文件。每個文件都會有一行叫做---PUBG-xxxxx--or ---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 及其值。也可以有多個 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

但範例輸出 forPUBG_NOPUBG-15166---forFILE15.sql 並且是PUBG-11720,for FILE5.sql

我需要特定 FILE_NAME 的文件中的所有 PUBG 值,而沒有任何--. FIlE5.sql 的 PUBG 值可以是PUBG-11720, PUBG-11406如何改進此循環以獲取準確的結果。

您不需要編寫循環。您可以將輸出通過管道傳輸到 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'

進一步分解命令:

  • 正則表達式“–+\ ?” 是您要查找和選擇的模式。這可以讀作“查找具有“-”後跟一個或多個連續“-”且後跟零或一個“”的模式。這將匹配“–”、“—”和“- –" 在您的輸出中。請注意,您將需要 sed 的 -E 標誌才能重新辨識這些量詞。這裡有一個快速參考,可以快速了解 ? 和 + 等正則表達式量詞
  • 這裡,替換空間是空的。這將用任何內容替換找到的模式,並且是剝離輸出的有效方法。
  • 標誌“g”表示搜尋將是全域的。如果沒有這個,替換只會發生在每行的第一個匹配項上。添加 g 將確保每行上該模式的每個實例都被替換為空。

您還可以將這些概念應用於您的初始 grep 命令以僅執行一次搜尋。

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

引用自:https://unix.stackexchange.com/questions/484420