.
не соответствует символу новой строки, а perl -p
обрабатывает одну строку за раз, поэтому заменяемая строка никогда не содержит более одной строки, и вам вообще не нужно сопоставлять символ новой строки.
perl -pi -e 's/\badClipString\b(.*)/2$1\x272=adClipString/' -- somefile.bas
Я изменил .+
на .*
, потому что вы не указали, что adClipString
не следует сопоставлять в конце строки. Я также окружил слово, которое нужно заменить, на \b
, чтобы такие вещи, как thisIsABadClipStringOtherVariable
не заменялись.
Дополнительная сложность заключается в том, что у вас есть файл с окончанием строки Windows: CR + LF. .
не соответствует LF (перевод строки, Unix / POSIX / в основном-все-но- Windows -nowadays символ новой строки), но соответствует CR (возврат каретки). Таким образом, эта замена помещает CR в середину строки (непосредственно перед началом комментария), что может сбить с толку программы Windows. Один из способов исправить это - исключить CR из группы «остальная часть строки».
perl -pi -e 's/\badClipString\b([^\r\n]*)/2$1\x272=adClipString/' -- somefile.bas
Другой способ выполнить это преобразование - рассматривать замену строки и добавление комментария как отдельные операции. Команда s
считается истинной, только если она производит замену.
perl -pi -e 's/\badClipString\b/2/ and s/\r?$/\x272=adClipString$&/' -- somefile.bas
Или, менее однострочным, но более читаемым способом:
perl -pi -e 'if (s/\badClipString\b/2/) { s/\r?$/\x272=adClipString$&/ }' -- somefile.bas
Регулярное выражение \r?$
соответствует в конце строки с необязательным CR. Подстановка помещает дополнительный текст в конец строки с $&
(что означает всю строку, совпадающую с регулярным выражением) в конце, чтобы сохранить необязательный CR.