3

Я пытаюсь создать команду для подстановки perl для пакета php-файлов в каталоге. Строка, которую я хочу заменить, содержит одинарные кавычки, и я не могу заставить ее правильно экранировать содержимое оболочки.

Я попытался повторить строку с неэкранированными кавычками, чтобы увидеть, что 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

Что я делаю неправильно?

4 ответа4

1

Используйте " вместо ' снаружи, тогда вам нужно только избежать двух " внутри выражения.

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

Внутри строки, заключенной в одинарные кавычки, не происходит никаких расширений или вычислений, даже экранирование от обратной косой черты. Когда размещены Nifle и canen, используйте вместо них двойные кавычки и избегайте их вместо одинарных кавычек. Однако вам нужно всего лишь избежать их для пользы вашей оболочки. Если вы планируете использовать этот 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"
0

Вы избегаете одинарных кавычек с одинарными кавычками. Например, предположим, что вы хотите сделать git commit со следующим сообщением: Обновлен метод save() BaseActiveRecord.

Для этого выполните следующую команду (и обратите внимание, что я экранирую одинарную кавычку с одинарной кавычкой).

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

Вы также можете достичь своей цели, используя двойные кавычки (и не избегая одиночных):

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

Тем не менее, обратите внимание, что двойные кавычки в командной строке приводят к расширению некоторых вещей (например, $ vars). Надеюсь это поможет.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .