替換 grep 找到的所有文件中的字元串。無法讓它工作
我用 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
事實上,您可以使用
sed
orperl
來完成您的任務。您不一定需要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'