2015-07-27 5 views
2

По определению строка должна заканчиваться символом новой строки (\n) (ref.). Но для целей этого поста я рассмотрю любую последовательность символов как строку, заканчивается ли она с \n.Как получить последнюю строку, содержащую n?

Команда tail -n 1 возвращает последнюю строку, заканчивается ли она \n. Как можно получить из файла последнюю строку, которая заканчивается \n, является ли эта строка последней строкой или второй-последней строкой файла?

+0

Возможной стратегией было бы разделение на символ новой строки и проверка, является ли последняя группа пустой (последняя строка заканчивается новой строкой) или нет (последняя строка не заканчивается новой строкой). Исходя из этого условия, вы можете выбрать последнюю группу или предыдущую группу. – HashPsi

+0

Я пробовал это. Проблема в том, что 'tail' не возвращает завершающий \ n независимо от того, присутствовал ли он в файле. Таким образом, информация теряется. –

+0

Вы должны полагаться на что-то другое, кроме хвоста, чтобы прочитать файл. – HashPsi

ответ

5
cat -vte file|grep "\$$"|tail -1 

Что относительно этого? Или какой-то другой способ, с кошкой -vte

Таким образом, дополнительные $ будут удалены:

echo -en "Enter\nEnter again\nNo enter this time"|cat -vte|grep "\$$"|sed 's/\$$//g'|tail -1 

+1 вариант для Linux (Perl регулярное выражение, позитивный взгляд вперед утверждение, показать соответствие часть только):

echo -en "Enter\nEnter again\nNo enter this time"|cat -vte|grep -Po ".*(?=\\\$$)"|tail -1 
+0

Да, похоже, что хорошо работает +1. Он просто добавляет дополнительные $ в конце строки, но это не большая проблема. Я понятия не имею, как это работает.Я был бы очень признателен, если бы вы хотели объяснить немного больше о том, как это работает. –

+0

Существует несколько случаев (и файлов), когда с вами пропали невидимые контрольные символы, и вы хотели бы посмотреть, что происходит, поэтому вы пытаетесь сделать видимыми все невидимые символы cat -vte, что заменит управляющие символы (и конец строк также) на что-то еще, например^M или $. cat -vte может использовать еще позже в цепочке труб: echo "...." | cat -vte | grep Другим решением было бы использовать команду tr, если вы можете указать один точный символ, который, безусловно, не будет в вашем файле, grep для этого персонажа, затем измените ситуацию. – zolo

+0

Если ваша оболочка умеет хорошо обрабатывать специальные символы, такие как ÷ или Ł, тогда они могут быть лучшим выбором для tr. – zolo

6

Вот один из способов вы можете сделать это с помощью Perl:

perl -ne '$s = $_ if /\n$/ }{ print $s' file 

скрипт считывает каждую строку й e файл один за другим и присваивает его переменной $s, если она заканчивается \n. После того, как файл был прочитан, печатается $s. Если последняя строка не заканчивается символом новой строки, то предпоследняя строка будет напечатана, как показано ниже:

$ cat file 
first line 
second 
third$ perl -ne '$s = $_ if /\n$/ }{ print $s' file 
second 

отметить, что я намеренно оставил в $, чтобы показать подсказку, которая в конце последняя строка файла из-за отсутствия символа новой строки.