Sed

替換 grep 找到的所有文件中的字元串。無法讓它工作

  • February 15, 2019

我用 grep 找到所有需要的文件:grep --include=\*.{php,ini,conf,sh} -ril -P "'([\d\w\-\_\.]+)(@domain.com)'" '/var/www_data/somepath/'

現在我假設它是使用 sed 或 perl 來進行替換過程,可惜我不知道如何在其中任何一個中使用上面的正則表達式。我看到了這種方式這種方式,但正如我所說,我無法讓它與我的模式一起工作(我的意思是在執行命令後我在下一行得到 >。我認為使用時上面顯示的正則表達式有問題使用 sed 或 perl),所以任何關於這件事的建議都會很好。

另外,我不知道這是否可能(這不是很重要),但我想為每個文件列印一些字元串,例如File fixed: /path/to/file/(可能是從 grep 列表中獲取的文件名?)

通常,當您>在點擊後在下一行中得到 a 時,這意味著您的一個報價尚未關閉。我在你的正則表達式中找不到那個錯誤。但是您不需要/var/www_data/somepath/用單引號將路徑括起來。我假設沒有不尋常的字元somepath

無論如何,我用 sed 測試了你的正則表達式。\d\w對我來說看起來像vim語法,這就是為什麼我把它翻譯成 ascii(它總是有效的)。此外,[]你的內心也不需要逃跑.

sed -r "s/'([A-Za-z0-9_-.]+)(@domain.com)'/'adsf'/g" test.dat

事實上,您可以使用sedorperl來完成您的任務。您不一定需要grep生成文件列表,除非您有 GB 的數據。然後預分類可能會帶來速度優勢。

要測試您的正則表達式,您可以執行以下操作:

cd /var/www_data/somepath/
sed -r 's|pattern|replace-pattern|g' a_single_file.php

當您對結果感到滿意時,只需添加-ibak( --in-place=bak) 參數並在所有文件上執行它

find . -type f -name '*.php' -o -name '*.ini' -o name '*.conf' -o -name '*.sh' \
-exec sed -r -ibak 's|pattern|replace-pattern|g' '{}' \; 

原始文件正在被放入<orignalname.php>.bak.

回答你的最後一個問題。對於這個工作,grep是你想要的工具,你可以在.bak上面 sed 生成的文件上執行它:

grep --recursive --include='*.bak' -E --files-with-matches 'pattern' . > files_fixed.txt

或者,簡單地說:

find . -type f -name '*.bak'

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