Как распечатать все, кроме Nth, до последней строки в sed?

One Solution collect form web for “Как распечатать все, кроме Nth, до последней строки в sed?”

Часть 1

Просто тринадцатая строка:

 sed '13d' <file.txt 

И общий способ сделать дополнение к вышесказанному:

 sed '13!d' <file.txt 

Часть 2

Потому что это можно сделать:

 sed -n ':a;${P;q};N;4,$D;ba' <file.txt 

Обратите внимание, что 4 – это номер, который вам больше нужен. Поэтому, если вы хотите, чтобы последняя 10-я строка, это было бы 11 .

Тестирование с помощью seq :

 $ seq 100 | sed -n ':a;${P;q};N;4,$D;ba' 98 $ 

Попытка объяснения

 :a # define label a ${ # match the last line P # print the first line of the pattern space q # quit } N # match all lines: append the next line to the pattern 4,${ # match the range of lines 4 to the end of the file D # delete the first line of the pattern space } ba # match all lines: jump back to label a 

Ценностное дополнение Гленна Джекмана:

Это была «только N-я линия». Вот «все НО N-й линии»:

 sed -n ':a;${s/^[^\n]*\n//;p;q};N;4,${P;D};ba' 

работает с GNU sed, последовательность \n может не работать с другими seds.


Я попробовал это с BSD sed (OSX) и обнаружил, что он не совсем работает в приведенной выше форме. Проблемы выглядят так:

  1. ; используемый для разделения строк, как правило, работает, но не работает после метки
  2. BSD sed, по-видимому, требует ; после последней команды в одной строке {} группы команд, тогда как GNU sed не
  3. \n обычно можно использовать в регулярном выражении, но, по-видимому, не в выражении скобки [] . Поэтому, чтобы исключить новые строки, мы можем вместо этого использовать нечто вроде [[:alnum:][:punct:][:graph:][:blank:]] , хотя это может исключать другие символы (в частности, другие управляющие символы).

Так что это попытка более независимой от платформы версии:

 sed -n ':a ${s/^[[:alnum:][:punct:][:graph:][:blank:]]*\n//p;q;};N;4,${P;D;};ba' 

Это, похоже, работает под OSX и Ubuntu.

  • простой стол поворота скрипта
  • Удалить узел XML, содержащий определенный элемент
  • Как изменить первую строку только на определенные файлы в папке с помощью sed
  • Как найти одно слово и последовательно заменить его?
  • Использование sed / awk для изменения слов между двумя шаблонами
  • Как отделить имена генов, подкрепленные подчеркиванием?
  • Как выполнить запрос-замену после заданного символа в строке?
  • Я хотел бы стереть предыдущую точку нескольких строк текста
  • Удаление строк, содержащих повторяющийся текст
  • sed регулярное выражение ведет себя иначе, чем в vim и perl?
  • sed - как печатать текстовый блок со второго шаблона?
  • Linux и Unix - лучшая ОС в мире.