Регулярное выражение Perl для игнорирования пустой строки

#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