Sed

當文件名包含空格時,搜尋並替換目錄中所有 .php 文件中的登錄字元串

  • May 30, 2020

我更改了 mySQL 的密碼和使用者名,我需要相應地替換所有 PHP 腳本中的連接字元串。

我在使用該命令時遇到問題,因為我的許多 php 文件名都包含空格。

我可以更改什麼以使此命令正常工作而不會出現“沒有此類文件或目錄”錯誤?

這是我正在使用的命令:

pattern='mysql_connect("localhost", "olduser", "oldpwd")'
replacement='mysql_connect("localhost", "newuser", "newpwd")'
find . -name "*.php" | xargs -n 1 sed -i -e 's|$pattern|$replacement|g'

我不熟悉 xargs 和 sed,我從這個答案複製了這段程式碼到一個類似的問題。

(我想我會把 mysql_connect 語句放到一個 php 包含文件中,下次只在一個地方更改它。)

我正在使用 BASH 執行 Ubuntu 14.04 LTS

您必須使用NULL byte和雙引號:

find . -name '*.php' -print0 |
   xargs -0 -n 1 sed -i -e "s|$pattern|$replacement|g"

或使用簡單的 for 循環

for p in *php; do
   sed -i -e "s|$pattern|$replacement|g" "$p"
done

了解如何在 shell 中正確引用,這非常重要:

“雙引號”每個包含空格/元字元和每個擴展的文字:"$var", "$(command "$var")", "${array[@]}", "a & b". 用於'single quotes'程式碼或文字$'s: 'Costs $5 US', ssh host 'echo "$HOSTNAME"'. 見

http://mywiki.wooledge.org/Quotes

http://mywiki.wooledge.org/Arguments

http://wiki.bash-hackers.org/syntax/words

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