【发布时间】:2016-09-05 19:13:57
【问题描述】:
我有一堆需要替换的数据库连接设置,希望这里有人可以用 sed 为我指明正确的方向。通常我使用 find 和 sed 组合来执行此操作,如下所示:
sudo find . -name "*.php" -print0 |
sudo xargs -0 sed -i '' -e 's#:/usr/share/php/pear:#:/usr/lib/php5/pear/:/usr/share/php/pear:#g'
但是对于数据库连接字符串,我需要替换如下所示的行:
define('DBUSER', 'dbuser');
由于各种原因,我不能只对用户名本身进行 sed,因此我需要更严格地定义可替换文本。不幸的是,我在正则表达式方面的有限技能使我无法正确地逃避整个序列,以便可以被 sed 找到并正确替换。我需要做什么才能基本上使用我通常用来替换那些 DBUSER 字符串中的用户名的相同 find/sed 命令?我尝试对单引号进行反斜杠转义,以及对每个单引号进行双引号,但这些都不起作用。这是在最新的 Ubuntu 14.04 系统上,没有任何花哨的定制。
提前感谢你们提供的任何帮助。我真的很感激。
【问题讨论】:
-
你可能只需要加倍 \ 转义它们。一个\用于
bash,另一个用于sed。 -
@CarlTashian 不,无论您使用什么工具(sed、awk 等),无论使用多少次,都不能在单引号分隔的 shell 脚本中使用单引号你试图逃避它。
-
感谢@EdMorton,这很有道理。
-
@CarlTashian 不客气。不,永远不要双引号脚本,除非它是绝对必要的,并且你有一个与双引号脚本产生的行为相关的非常具体的目的(即你试图让某事发生,而不是试图阻止某事发生,并且加倍引用是这样做的方法)并完全理解警告/哥特式。请参阅my answer 了解原因。