Bash
正則表達式從日誌文件中提取文件路徑
我需要從日誌文件中獲取文件路徑。我想我會用正則表達式試試這個。
文件路徑如下所示:
75/751234/751234V0001_test-tag1-tag02-75x75_01.jpg
我不是正則表達式的專家,所以我只能用下面的表達式到達第二個斜線。我也通過正則表達式獲得文件名的開頭,但我無法獲得後面的幾個關鍵字。
([0-9]{2})[\/]([0-9]{2,10})[\/]
現在我仍然缺少實際文件名的正則表達式。文件名的開頭總是有一個數字。之後,理論上可以有無限的關鍵字。
文件副檔名可以是 .jpg、.tif、.zip 等。
所以輸出應該是文件路徑
75/751234/751234V0001_test-tag1-tag02-75x75_01.jpg
也許有人有一個解決方案,甚至是對我迄今為止的正則表達式的改進。
您的文件路徑似乎組織如下:
- 文件名以多位數字開頭。
- 路徑以包含該數字的前兩位數字的目錄開頭。
- 它繼續一個由整個數字組成的子目錄。
- 有問題的文件直接位於該子目錄中,並且除了以上述數字開頭之外,還具有來自有限可能性的副檔名。
如果您有不同的方法來辨識包含文件名的行,這可能是更可取的。如果有不同模式的文件名,並且您想專注於顯示的模式,那麼下面的 RegEx 應該可以工作(範例
grep
在 ERE 模式下使用 GNU):grep -E -w -o '([[:digit:]]{2})/(\1[[:digit:]]+)/\2[^[:digit:]][^/]*\.(jpg|tif|zip)' logfile.txt
這使用反向引用(
\1
和\2
)來確保“相同的文本”在字元串的不同位置匹配。
- 字元串必須以兩位數字和一個斜杠開頭。
- 然後它需要以與開頭相同的兩位數字繼續,後跟一個未指定的數字(如果數字具有固定範圍,則可以替換為)和
+
斜線{2,10}
- 然後,它以與第二個路徑元素相同的數字開頭,後跟一個非數字字元(以確保該數字與第二個路徑元素確實相同)和
/
除-directories 或保護同一行上存在多個文件路徑)直到文件副檔名的最終替代方案(您可以根據需要調整的數量)。- 該
-o
選項確保只返回行的匹配部分(即文件路徑)。該-w
選項確保結果僅匹配完整字元串,即不匹配可能較長文件路徑的子字元串。這要求文件名不包含空格(這是文件名的有效字元!)。請注意,嚴格來說,反向引用是保證僅在基本正則表達式中有效的功能,而替代方案僅保證在擴展正則表達式中有效。GNU
grep
擴展的正則表達式確實允許反向引用,所以它在這種情況下有效(這可能不是太大的限制)。