Bash

如何在多個文件中使用 sed 就地替換將一個 url 替換為另一個?

  • August 12, 2015

正如您在下面的腳本範例中看到的那樣,我正在嘗試在使用該 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/的測試文件。

引用自:https://serverfault.com/questions/711598