Text-Processing

正則表達式模式和替換行替換

  • April 4, 2018

對於遷移過程,我需要在我的 bash 腳本中進行一些替換。

所以在我的 .txt 文件中,我有這些參考資料,例如:

[[File:My Image.png|400px|thumb|center|My Image]]
[[File:My Image.png|400px|thumb|center]]
[[File:My Image.png|400px|thumb]]
[[File:My Image.png|400px]]
[[File:My Image.png]]

我需要做的是用這一行替換所有這些事件(只有 - 所以沒有更多的大小、描述或其他資訊):

[[File:My Image.png]]

因此,我嘗試建構一個 PCRE 正則表達式來提取所有圖像名稱:

/File:(.*\..{3})/g

我已經建構了這個最終命令來查找我的 .txt 文件中的所有匹配項,並使用我的正則表達式提取圖像名稱:

find . -name "*.txt" | xargs perl -i -p -e 's/File:(.*\..{3})/$1/g'

但是,我遇到了一些問題:

  • 一個錯誤:

xargs:被破壞的報價

  • 最後我不知道如何使用提取的圖像名稱來替換所有出現(完整的行)

PS:我在 MacOS 系統上使用 bash v4

嘗試

find . -name '*.txt' -exec perl -i -pe 's/File:[^|]+\K\|[^]]+//g' {} \;
  • File:[^|]+匹配File:後跟非|字元
  • \K這樣我們就不必擷取前面的字元串並將其放回替換部分
  • \|[^]]+匹配|後跟]要刪除的非字元
  • 也可以用sed -i '' 's/\(File:[^|]*\)|[^]]*/\1/g'代替perl

進一步閱讀:

我寫了一個新的正則表達式,它匹配整個[[...]],並且只用你想要保留的東西替換它。它假定文件名不包含管道|字元或終止符]]。我無法用 重現您的問題xargs,但我還是用find-exec選項替換了它;以下適用於我在 Linux 上。

find . -name "*.txt" -exec perl -i -pe 's/(\[\[File:[^|]*).*?(\]\])/$1$2/g' '{}' +

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