【问题标题】:bash scripting: find and replace multiword stringbash 脚本:查找和替换多字字符串
【发布时间】:2014-02-17 08:26:01
【问题描述】:

我正在尝试编写一个 bash 脚本来配置服务器,我需要更改行:

    listen = /var/run/php5-fpm.sock

等于:

    listen = 127.0.0.1:9000

在文件中:

    /etc/php5/fpm/pool.d/www.conf

所以我一直在查看使用 sed 的教程,我尝试了以下命令无济于事:

    $~: sed -i 's//var/run/php5-fpm.sock/127.0.0.1:9000/g' /etc/php5/fpm/pool.d/www.conf
    $~: sed: -e expression #1, char 8: unknown option to `s'

我尝试用反斜杠转义正斜杠:'/',但我认为我走错了路。一定有更好的方法来做到这一点?

感谢您的帮助。

【问题讨论】:

    标签: linux bash sed debian


    【解决方案1】:

    这是因为您试图替换模式中的字符 '/',而该字符用于分隔 's///' 表达式。您有两种选择,您可以使用 '/' 或转义每个 '/' 字符 - 这是我更喜欢的一个,使用不同的字符来分隔模式和替换字符串 - 我倾向于使用 '!'

    紧跟在“s”之后的字符用于分隔表达式。

    sed -i 's!/var/run/php5-fpm.sock!127.0.0.1:9000!g' /etc/php5/fpm/pool.d/www.conf
    

    我实际上已经养成了总是使用“!”的习惯对于 sed 和 perl - 因为您最终不得不转义更少的字符并最终节省时间。

    【讨论】:

    • 非常感谢,我会记住这个提示!
    • 当心:!bash 中的一个元字符,来自 C shell 世界的侵扰。在单引号内(AFAIK)很好,但在双引号或外引号中可能会导致问题。正则表达式应该几乎总是单引号,所以这不是一个大问题。
    猜你喜欢
    • 2016-01-23
    • 1970-01-01
    • 2019-11-03
    • 2022-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-06
    • 1970-01-01
    相关资源
    最近更新 更多