#regex #perl
#регулярное выражение #perl
Вопрос:
У меня есть выражение perl, которое отображает числовую цифру из последней строки текстового файла. Мое выражение perl выглядит следующим образом
tail -1 new.txt | perl -e 'while (<>) {s/----//; s/:.*$//; print "$_n" ;}'
что приводит к 109
, и new.txt является:
----109:new change
no blank lines below this
Теперь, как я могу изменить выражение так, чтобы даже если оно находило пустые строки ниже, ----109:new change
оно пропускало их и возвращало 109
только?
Мой new.txt выглядит так, как показано ниже
Create TAble <TAble name>
----109:new change1
Update Table <TAble name>
----110:new change2
Drop table <tablename>
----111:new change3
<empty line>
<empty line>
согласно этому текстовому файлу, он должен выдавать 111 в качестве результата, хотя после последней непустой строки есть много пустых строк
Краткое изложение моего требования таково
Мне нужно отобразить 111 в результате, независимо от того, сколько пустых строк и пробелов будет в конце.
Ответ №1:
Он будет печатать номер только тогда, когда он найден после ----
,
tail -1 new.txt | perl -lne 'print $1 if /----(d )/'
-l
неявный разрыв строки и добавление новой строки послеprint
-n
неявныйwhile(<>){ }
цикл вокруг кода
обновление: выбрать только последнее число,
perl -lne '$num =$1 if /----(d )/ }{print $num' new.txt
Комментарии:
1. у меня так много —- в моем текстовом файле. я хочу выбрать последнюю, даже если после нее есть пустые строки
2. теперь оно выдает мне пустую строку
3. Создать таблицу <Имя таблицы> —-109 : новое изменение 1 Обновляет таблицу <Имя таблицы> —-110 : новое изменение 2 для удаления таблицы <имя_таблицы> —-111 : новое изменение3
4. @user3793536 опубликуйте приведенный выше комментарий в своем вопросе.
5. нет.. не сработало .. каждый раз, когда я получаю пустую строку .. я добавил пустые строки и проверил, что пробелов нет
Ответ №2:
Добавьте next unless $_;
в свой цикл, чтобы использовать полностью пустые строки. Однако tail -1 всегда будет давать вам только последнюю строку, поэтому вам нужно будет начать дальше в файле, вот так:
tail -5 new.txt | perl -e 'while (<>) {next unless $_; s/----//; s/:.*$//; $last=$_; } print "$lastn";'
Замените -5 на наибольшее количество пустых строк, которое у вас может быть. Это выведет последнее число, видимое в файле.
Комментарии:
1. в результате я получаю 3-4 пустые строки
2. Как это может быть? Приведенный выше код Perl содержит только один оператор печати вне цикла
3. Просто отмечу, что
next unless $_
в этом случае работает хорошо, но принципиально игнорирует любые строки, имеющие значение false, т. Е. игнорирует строки, содержащие числовое значение 0. Альтернативой может бытьnext if /^s*$/
.
Ответ №3:
Вы говорите, что вам нужно обработать последнюю непустую строку. Вот как вы это получаете:
tac new.txt | sed -e '/./,$!d' | head -n 1
Вы можете передать его в свою команду perl. Или, например, этот:
| perl -pe 's/D*(d ):.*/$1/'
Собираем все вместе:
tac new.txt | sed -e '/./,$!d' | head -n 1 | perl -pe 's/D*(d ):.*/$1/'
возвращает 111
для предоставленного вами примера.
Комментарии:
1. Спасибо, но это не дает мне никакого результата
2. Не могли бы вы попробовать только первую часть и посмотреть, даст ли она какой-либо результат?
3. он просто переходит к следующему line.no результат
4. @user3793536 Не могли бы вы предоставить образец содержимого new.txt тогда файл? Спасибо.
5. Создать таблицу <Имя таблицы> —-109 : новое изменение 1 Обновляет таблицу <Имя таблицы> —-110 : новое изменение 2 для удаления таблицы <имя_таблицы> —-111 : новое изменение3