回答:
単にd
13行目を削除します。
sed '13d' <file.txt
上記を補完する一般的な方法は次のとおりです。
sed '13!d' <file.txt
それができるので:
sed -n ':a;${P;q};N;4,$D;ba' <file.txt
4
必要な数より1つ多いことに注意してください。したがって、最後の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
シーケンスは他のsedでは動作しない場合があります。
私はBSD sed(OSX)でこれを試してみましたが、上記の形式ではうまく機能しませんでした。問題は次のようです。
;
行を区切るために使用されますが、通常は機能するようですが、ラベルの後には機能しません;
は、1行の{}
コマンドグループの最後のコマンドの後に必要なようですが、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
)は彼らがすることをするために最適化されているからです。
head
/tail
ソリューションがソリューションよりもはるかに遅いことを示唆していsed
ます。ありがとう。