无法逃避shell中的单引号


3

我正在尝试命令在目录中的一批php文件上执行perl替换。我想要替换的字符串中有单引号,我无法正确地转义in shell。

我尝试用未转义的引号回显字符串,看看perl会得到什么:

echo 's/require_once\('include\.constants\.php'\);/require_once\('include\.constants\.php'\);require_once\("\./functions/include\.session\.inc\.php"\);/g'

它在结果中没有单引号:

s/require_once\(include.constants.php\);/require_once\(include.constants.php\);require_once\("\./functions/include\.session\.inc\.php"\);/g

但是,当我试图逃避单引号时:

echo 's/require_once\(\'include\.constants\.php\'\);/require_once\(\'include\.constants\.php\'\);require_once\("\./functions/include\.session\.inc\.php"\);/g'

我得到提示来完成命令:

>

我想要解析的是:

s/require_once\('include.constants.php'\);/require_once\('include.constants.php'\);require_once\("\./functions/include\.session\.inc\.php"\);/g

我究竟做错了什么?

Answers:


1

使用"而不是'在外面,然后你只需要"在表达式内转义两个。

echo "s/require_once\('include.constants.php'\);/require_once\('include.constants.php'\);require_once\(\"\./functions/include\.session\.inc\.php\"\);/g"

我得到命令完成提示:(
user13743 2010年

@ user13743 - 您是否复制粘贴我的解决方案。你有什么类型的外壳?
Nifle 2010年

是的,我复制并粘贴了你的解决方案。$ echo $SHELL/bin/bash
user13743 2010年

@ user13743 - echo "s/require_once\('include"如果可行,请尝试添加更多字符串echo "s/require_once\('include.constants.php'\);/"。重复直到它破裂。这应该缩小错误范围。
Nifle 2010年

1

在单引号字符串中没有任何扩展或评估,甚至没有反斜杠转义。正如Nifle和canen发布的那样,使用双引号代替,而不是单引号。但是,您只需要逃脱它们以获得shell的好处。如果您打算s///在perl脚本中直接使用它,则不需要转义,因为您通常不会s///在引号中括起来。

此外,您的s///操作将失败,因为您/的替换字符串中有分隔符。反斜杠 - 逃避斜杠/functions/include

s/require_once\('include.constants.php'\);/require_once\('include.constants.php'\);require_once\("\.\/functions\/include\.session\.inc\.php"\);/g

或选择不同的分隔符:

s@require_once\('include.constants.php'\);@require_once\('include.constants.php'\);require_once\("\./functions/include\.session\.inc\.php"\);@g

0

为什么不使用双引号?

"s/require_once\('include.constants.php'\);/require_once\('include.constants.php'\);require_once\("\./functions/include\.session\.inc\.php"\);/g"

这不打印“在第二次require_once
Nifle

0

您使用单引号转义单引号。例如,假设您想使用以下消息进行git提交:更新了BaseActiveRecord的save()方法。

为此,请运行以下命令(并注意我使用单引号转义单引号)。

git commit -m 'Updated BaseActiveRecord''s save() method.'

你也可以用双引号来实现你的目标(而不是逃避单引号):

git commit -m "Updated BaseActiveRecord's save() method."

但是,请注意命令行上的双引号会导致某些事情被扩展(即$ vars)。希望这可以帮助。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.