我正在尝试运行 sed 来替换文件中的某些文本,我将文本拆分开,单独运行 sed 以确保所有内容都正确转义并且正常工作。当我将它们重新组合在一起时,它没有任何变化。有人能告诉我我做错了什么吗?
这是我正在运行的命令
sed -i -e 's/"php" => \x27\x27,/"php" => \x27\/opt\/remi\/php70\/root\/usr\/sbin\/php-fpm\x27,/g'
它应该改变
"php" => '',
到
"php" => '/opt/remi/php70/root/usr/sbin/php-fpm',
我认为它可能与空格有关,因为代码的缩进方式或我尝试了几件事但没有任何进展。
它位于如下块中:
$pathToExternals = array(
"php" => '', // Something like /usr/bin/php. If empty, will be found in PATH.
"curl" => '', // Something like /usr/bin/curl. If empty, will be found in PATH.
"gzip" => '', // Something like /usr/bin/gzip. If empty, will be found in PATH.
"id" => '', // Something like /usr/bin/id. If empty, will be found in PATH.
"stat" => '', // Something like /usr/bin/stat. If empty, will be found in PATH.
);
任何指点都将不胜感激!
谢谢
答案1
看来您的源文件中可能有一些制表符,而 sed 命令只假定空白。要执行替换,无论空白是由空格还是制表符组成,请尝试:
sed -i -e 's/"php"[[:space:]]*=>[[:space:]]*\x27\x27,/"php" => \x27\/opt\/remi\/php70\/root\/usr\/sbin\/php-fpm\x27,/g'
[[:space:]]*
匹配零个或多个任意空格字符。
作为阿尔哈迪斯指出,如果我们对替换命令使用不同的分隔符,则可以避免转义/
。例如,我们可以选择|
:
sed -e 's|"php"[[:space:]]*=>[[:space:]]*\x27\x27,|"php" => \x27/opt/remi/php70/root/usr/sbin/php-fpm\x27,|g'