Text-Processing
正則表達式模式和替換行替換
對於遷移過程,我需要在我的 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
進一步閱讀:
- 為什麼循環查找的輸出是不好的做法?- 它有很多關於使用
find
命令的細節,包括使用-exec
選項..- 什麼時候需要 xargs?
我寫了一個新的正則表達式,它匹配整個
[[...]]
,並且只用你想要保留的東西替換它。它假定文件名不包含管道|
字元或終止符]]
。我無法用 重現您的問題xargs
,但我還是用find
’-exec
選項替換了它;以下適用於我在 Linux 上。find . -name "*.txt" -exec perl -i -pe 's/(\[\[File:[^|]*).*?(\]\])/$1$2/g' '{}' +