Perl регулярное выражение для соответствия <foo>eof - PullRequest
1 голос
/ 02 февраля 2011

Как использовать поиск по регулярному выражению Perl для поиска файлов, заканчивающихся на:

-------\r\n<eof>

В шестнадцатеричном виде это:

2D 2D 2D 2D 0D 0A (the end of the file)

Я в UltraEdit, который говорит, что использует синтаксис Boost Perl regex.

Я нашел достаточно, чтобы использовать:

----\x0d\x0a

, который находит нужные мне строки, но только среди сотен других, которых нет в конце файла:

whatever
------------     <- matches this also, which I don't want!
whatever
------------     <- matches this also, which I don't want!
whatever

Ответы [ 3 ]

2 голосов
/ 02 февраля 2011

Движок регулярных выражений UltraEdit работает линейно.Это означает, среди прочего, что он не различает конец строки и конец файла.

Он также не знает маркеров конца строки \z или \Z.Кроме того, отрицательное прогнозное утверждение типа -----\r\n(?!.) не работает в UE.

Таким образом, механизм регулярных выражений UE подводит вас здесь.Что вы могли бы сделать, это использовать макрос:

InsertMode
ColumnModeOff
HexOff
Key Ctrl+END
Key UP ARROW
PerlReOn
Find RegExp "-----\r\n"
IfFound
# Now do whatever you wanted to do...
EndIf

и заставить UE применить это ко всем вашим файлам.

0 голосов
/ 19 декабря 2012

Вот один из способов сделать это с помощью UltraEdit JavaScript.

Перейти в конец файла с помощью UltraEdit.activeDocument.bottom (); Используйте UltraEdit.activeDocument.currentPos (); сохранить вашу текущую позицию.

Поиск в обратном направлении для "\ r \ n" Снова используйте UltraEdit.activeDocument.currentPos (); и сравните результаты с предыдущей позицией, чтобы определить, действительно ли это значение cr / lf в конце файла.

Сделайте любую замену / вставку, которую вы имели в виду, основываясь на этих позициях символов, или бросьте окно с сообщением о результатах.

0 голосов
/ 02 февраля 2011

Вам нужно перебирать каждую строку в файле и использовать регулярное выражение?Если нет, просто seek в нужном месте файла и проверьте равенство строк:

open my $fh, '<', $the_file;
seek $fh, 2, -6;            # seek to the end of file minus 6 bytes
read $fh, my $x, 6;         # read 6 bytes into $x
if ($x eq "----\r\n") {
    print "The end of file matches ----\\x0d\\x0a\n";
} else {
    print "The end of file doesn't match ----\\x0d\\x0a\n";
}
...