Bash

SED 不能處理複雜的字元串

  • June 22, 2017

我有一個像這樣開頭的文件:

[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 -iswitch 是對原始版本的擴展,sed因此在不同版本中的實現可能略有不同。 與GNU不同, BSDsed要求您在使用開關時顯式使用開關來表示您的命令。sed-e``-i

採用:

sed -i-e"s#$search#$replace#" $file

正如您的錯誤消息已經暗示的那樣。

當諸如此類的細節對您不利時,編寫真正可移植的腳本是一個 PITA。

引用自:https://serverfault.com/questions/857237