Bash

正則表達式從日誌文件中提取文件路徑

  • August 22, 2022

我需要從日誌文件中獲取文件路徑。我想我會用正則表達式試試這個。

文件路徑如下所示:

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選項確保結果僅匹配完整字元串,即不匹配可能較長文件路徑的子字元串。這要求文件名不包含空格(這是文件名的有效字元!)。

請注意,嚴格來說,反向引用是保證僅在基本正則表達式中有效的功能,而替代方案僅保證在擴展正則表達式中有效。GNUgrep擴展的正則表達式確實允許反向引用,所以它在這種情況下有效(這可能不是太大的限制)。

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