Sedの交換が期待どおりに機能しない

Sedの交換が期待どおりに機能しない

listen = 127.0.0.1:9000私はに交換したいlisten = '/var/run/php56-fpm.sock'

sudo sed -i 's/listen = 127.0.0.1:9000/listen = \'/var/run/php56-fpm.sock\'/g' /etc/php-fpm.d/www.conf

間違い:

bash: -c: line 63: unexpected EOF while looking for matching `''
bash: -c: line 64: syntax error: unexpected end of file

答え1

まず、A single quote may not occur between single quotes, even when preceded by a backslash.参考資料バッシュマニュアル

第二に、文字列の区切り文字を /置き換える代わりに、他の文字を区切り文字として使用することもできます。/

結果:

sudo sed "s#listen = 127.0.0.1:9000#listen = '/var/run/php56-fpm.sock'#g" /etc/php-fpm.d/www.conf

まだ使用されていません-i。印刷物を確認して、期待どおりに機能していることを確認してください。

答え2

区別のために/代わりに別の文字を使用してみてください。

sudo sed -i "s@listen = 127.0.0.1:9000@listen = '/var/run/php56-fpm.sock'@g" /etc/php-fpm.d/www.conf

または

sudo sed -i "s/listen = 127.0.0.1:9000/listen = '\/var\/run\/php56-fpm.sock'/g" /etc/php-fpm.d/www.conf

問題は、/asをエスケープせずに\/@を区切り文字として使用すると問題が解決されることです。一貫性がある限り、sedではどの区切り文字でも使用できます。

@Davidの説明は正しいです。 bashのマニュアルに従って、二重引用符を使用してください。

ヒント:すべてのUXファイルの最後の空行にはEOFが必要です。

関連情報