Это не ошибка Perl, а Windows. Linux оболочки расширяют подстановочные знаки для вас, cmd.exe нет. Я не знаю, что такое PowerShell, но, похоже, и этого нет.
Кроме того, вы не хотите интерпретировать звездочку как регулярное выражение, а как шаблон с глобусом. В регулярном выражении *
означает «предыдущая вещь должна повторяться ноль или более раз».
Вы можете использовать Perl s glob function:
perl -p -i'.bak' -e 'BEGIN {@ARGV = glob shift} s#__SUB__CWD__#'$(pwd)'#g' *.sql
Обратите внимание, что вам нужно использовать обратную косую черту sh в пути, чтобы Perl не мог их интерпретировать, т. Е. Используйте $($pwd -replace '\\', '\\')
вместо $(pwd)
. Вам также необходимо поставить в обратном порядке sh #
символы в пути, так как в противном случае они будут пониматься как разделители, поэтому используйте $($pwd -replace '[\\#]', '\$&')
.
Поэтому было бы даже чище не использовать $(pwd)
, но пусть Perl знает, что такое замена:
perl -p -i'.bak' -e 'BEGIN{ ($pwd, @ARGV) = (shift, map glob, @ARGV) }
s/__SUB__CWD__/$pwd/g' -- $(pwd) *.sql
Первый аргумент присваивается $pwd
через shift , остальные атрибуты отображаются в glob, что означает Вы можете указать более одного шаблона подстановки.