Как добавить текст в строку, содержащую замену в Perl? - PullRequest
2 голосов
/ 30 мая 2020

Моя цель - заменить все именованные константы в файле *.bas на их соответствующие значения, а затем добавить комментарий к строке с парой значение-константа для дальнейшего использования.

Например, я хочу чтобы изменить эту строку:

Print #lngFile, rst.GetString(adClipString, -1, ",", vbNullString);

На это:

Print #lngFile, rst.GetString(2, -1, ",", vbNullStrings); '2=adClipString

Где константа ADODB adClipString заменяется ее длинным значением 2, а комментарий добавляется к line.

Ближайшее, что я получил, это следующее:

perl -pi -e 's/adClipString(.+\n)/2$1\x272=adClipString\n/' -- somefile.bas

... но я не могу понять, как исключить \n из группы захвата без также перезапись каждой строки в файле. Как написано, комментарий помещается в новую строку (что я не хочу). Я уверен, что ответ прямо передо мной.

Я новичок в perl, так как запустил его только в командной строке. Я уверен, что есть лучший [читай: рабочий] способ подойти к этому.

1 Ответ

1 голос
/ 30 мая 2020

. не соответствует символу новой строки, а 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...