遞歸替換檔案中的字串

遞歸替換檔案中的字串

我想page_path\example_filename.txt用正斜線替換字串中的反斜線。我還希望能夠在大型檔案系統上運行它並讓它遞歸搜尋所有目錄。

我在網上發現有人說要使用grep, xargssed但我無法讓它工作。我一直在嘗試分隔符號和轉義字元的不同變體,但沒有得到它。

這是我試圖運行的命令:
grep -lr -e 'page_path\\' * | xargs sed -i 's/page_path\/page_path//g'

提前致謝。

答案1

使用 時grep | xargs,您會遇到檔案名稱中的空格、引號、反斜線(可能還有更多取決於實作xargs)的問題。

grep透過 和的GNU 實現xargs,您可以透過使用: 來避免這些問題,grep -lZr ... | xargs -r0 sed ...它使用零位元組作為分隔符號。

現在關於 sed 命令:技巧是您可以使用而不是s/a/b/任何其他字元作為分隔符,例如s#a#b#

sed -i 's#page_path\\#page_path/#g'

答案2

您也可以使用 find 來實現:

find /your/path -type f -exec grep -l 'page_path\\' {} \; -exec sed -i 's#page_path\\#page_path/#g' {} \;

只有當第一個執行成功時才會執行第二個執行,並且您不會遇到無法列印或轉義檔案名稱中需要字元的問題。

答案3

為什麼要浪費 CPU 週期來呼叫所有這些命令巴什是否已經建構了可以減少打字次數的功能?

例子

str='page_path\example_filename.txt'
echo "${str//\\/\/}"

輸出

page_path/example_filename.txt

答案4

ripgrep也可以在這裡提供幫助,將 foo 替換為您要匹配的內容,然後在rg呼叫和sed表達式中進行更改。

rg foo --files-with-matches | xargs sed -i 's/foo/bar/g'

如果您的檔案名稱中可能有空格,請告訴 ripgrep 要用 NULL 位元組分隔它們

rg foo --files-with-matches -0 | xargs -0 sed -i 's/foo/bar/g'

來源:https://github.com/BurntSushi/ripgrep/blob/master/FAQ.md#search-and-replace

相關內容