Bash
SED 不能處理複雜的字元串
我有一個像這樣開頭的文件:
[global] pid = /var/run/php-fpm/php-fpm.pid error_log = /var/log/php5-fpm.log
並想更換
error_log = /var/log/php5-fpm.log
和
error_log = /var/log/php-fpm/error.log
我想為此使用腳本並執行以下操作:
search='error_log = /var/log/php5-fpm.log' replace='error_log = /var/log/php-fpm/error.log' for file in `find -name 'php-fpm.conf'`; do grep "$search" $file &> /dev/null if [ $? -ne 0 ]; then echo "Search string not found in $file!" else sed -i "s#$search#$replace#" $file fi done
這會引發此錯誤:
sed: -e expression #1, char 0: no previous regular expression sed: -e expression #1, char 0: no previous regular expression
IIRC
-i
switch 是對原始版本的擴展,sed
因此在不同版本中的實現可能略有不同。 與GNU不同, BSDsed
要求您在使用開關時顯式使用開關來表示您的命令。sed
-e``-i
採用:
sed -i
-e
"s#$search#$replace#" $file
正如您的錯誤消息已經暗示的那樣。
當諸如此類的細節對您不利時,編寫真正可移植的腳本是一個 PITA。