Просто d
поднимаем 13-ю строку:
sed '13d' <file.txt
И общий способ сделать дополнение к вышесказанному:
sed '13!d' <file.txt
Потому что это можно сделать:
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-я строка". Вот "all BUT the Nth line":
sed -n ':a;${s/^[^\n]*\n//;p;q};N;4,${P;D};ba'
работает с GNU sed, последовательность \n
может не работать с другими seds.
Я попробовал это с BSD sed (OSX) и обнаружил, что это не совсем работает в приведенном выше виде. Похоже, что проблемы с:
;
, использовавшейся для разделения строк, в общем, работает, но не работает после того, как метка ;
после последней команды в однострочной группе команд {}
, в то время как GNU sed не\n
в общем может использоваться в регулярном выражении, но, по-видимому, не в выражении в скобках []
]. Поэтому для исключения новых строк можно использовать нечто наподобие [[:alnum:][:punct:][:graph:][:blank:]]
, хотя это может исключать другие символы (в частности, другие управляющие символы). Таким образом, это попытка создания более платформонезависимой версии:
sed -n ':a
${s/^[[:alnum:][:punct:][:graph:][:blank:]]*\n//p;q;};N;4,${P;D;};ba'
Похоже, что это работает под OSX и Ubuntu.
В Emacs есть опция - eval
, которую вы можете использовать, подробности здесь . Но если вы делаете это часто, возможно, вам не захочется запускать весь emacs все время. Вместо этого вы можете запустить emacs-server, а затем просто использовать гораздо более легкий emacsclient
; см. здесь .