Частина 1
Просто d
оберіть 13-й рядок:
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
послідовність може не працювати з іншими седами.
Я спробував це з BSD sed (OSX) і виявив, що він не дуже працює у формі вище. Виглядають проблеми:
;
Використовується для розділення рядків, як правило, працює, але не працює після мітки
- Здається, BSD sed вимагає
;
після останньої команди в однорядковій {}
командній групі, тоді як 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.
head
/tail
рішення набагато повільніше, ніжsed
рішення. Спасибі, хоча.