Bash
如何在多個文件中使用 sed 就地替換將一個 url 替換為另一個?
正如您在下面的腳本範例中看到的那樣,我正在嘗試在使用該 URL 模式找到的所有文件中查找和替換(就地替換)作為 URL 一部分的字元串與另一個字元串(url 部分)。
換句話說,必須找到所有包含“ https://hostname/ ”的*.txt 文件,然後必須將整個文件中的字元串“ https://hostname/ ”替換為“ https://hostname.fq ” .dn/ '
到目前為止,我把這個放在一起:
grep -L -R -e 'https://hostname/' /srv/www/htdocs/intranet/data/pages/ | grep '.txt$' | xargs -n1 sed -i.bak 's|https://hostname/|https://hostname.fq.dn/|'
我想某處的 sed 正則表達式中一定有錯誤。我搜尋並閱讀了幾個小時,仍然沒有發現問題。備份文件由 sed 創建,但文件中似乎沒有任何內容被替換。
有什麼建議給我嗎?就像我如何調試我在 sed 中使用的正則表達式一樣?我很迷茫,甚至還沒有在 stackexchange/serverfault 上找到類似的東西。
我的天啊!我真蠢。我終於在這裡找到了錯誤。正則表達式很好並且工作正常。它的grep選項’-L’完全是廢話。它應該是 ‘-l’ 來返回匹配的路徑和文件名。
grep -l -R -e 'https://hostname/' /srv/www/htdocs/intranet/data/pages/*.txt | xargs -n1 sed -i.bak 's|https://hostname/|https://hostname.fq.dn/|'
呃!!!很抱歉這裡的麻煩。
我建議在一個選定的文件上進行調試:
sed 's|something|replacement|g' a_file.txt
看看會發生什麼。
當你的正則表達式被調試時,你可以像這樣簡化你的命令:
shopt -s globstar sed -i.bak 's|https://hostname/|https://hostname.fq.dn|g' /srv/www/htdocs/intranet/data/pages/{,**/}*.txt
不需要 grep 和 xargs。
您提供的正則表達式適用於僅包含https://hostname/的測試文件。