regex strawberry perl (windows) в одну строку для исправления нескольких символов перевода строки (0a) - PullRequest
0 голосов
/ 15 октября 2019

В Windows мне приходит отчет с сервера MS SQL со встроенными дублирующимися переводами строк, которые вызывают ошибки при чтении в LOAD DATA INFILE в mySQL в среде Windows. Я исправляю это, используя три однострочника Strawberry Perl в скрипте Powershell.

Соглашение Windows \ n \ n 'распознается Strawberry Perl, и это его выходной формат. Однако я не мог заставить Perl распознавать пустые строки с помощью одного перевода строки 0x0a, поскольку аромат Perl Strawberry всегда интерпретировал бы это как новую строку и включал бы ее в вывод.

Мое решение состояло в том, чтобы простозаменить все символы перевода строки 0x0a строкой, которая вряд ли появится в содержимом:

<*  script is Powershell, initialize source file name*>
$myLoginCSV = 'User%5FProfile%5FReport.csv' 

<*  convert linefeed (0a) chars into string LINEFEEDCHAR *>
$perlarg='-i.p.bak -p -e "s/\x0A/LINEFEEDCHAR/g"'
perl $perlarg $myLoginCSV

<*  de-duplicate linefeeds*>   
$perlarg='-i.p.bak -p -e "s/(LINEFEEDCHAR){2,}/LINEFEEDCHAR/g"'
perl $perlarg $myLoginCSV

<*  restore the 0a linefeed characters by substituting for LINEFEEDCHAR *> 
$perlarg='-i.p.bak -p -e "s/LINEFEEDCHAR/\x0a/g"'
perl $perlarg $myLoginCSV

Я пытался сделать это одной строкой, но не смог понять, как это сделать. Strawberry Perl интерпретирует перевод строки с фиксированным поведением, чтобы сделать его совместимым с Windows. Этот «три лайнера» работает хорошо и быстро. Попытка сделать это с помощью собственного регулярного выражения Powershell была более чем в 10 раз медленнее.

В частности, в среде Windows Strawberry Perl, есть ли способ сделать это менее чем за три строки?

Это не высокий приоритет. Один урок, который я извлек из этого, заключается в том, что решение регулярных выражений, использующее Strawberry Perl в Windows, может иметь многострочное решение, но при этом быть быстрым. В будущем я не буду настолько привязан к настоящему «однострочному» решению, когда пару дополнительных строк выполнят свою работу.

1 Ответ

1 голос
/ 16 октября 2019

Хлюпать и заменять последовательные новые строки на один.

perl -0777 -i.p.bak -lpe "s/\R+/\n/g" User%5FProfile%5FReport.csv
...