sedのN番目から最後の行以外をすべて印刷するにはどうすればよいですか?


9
  • の補完/反対をしたい

    sed 13q;d <file.txt
    

    より一般的には、この種の補数/逆数/逆数をこのようにすることは可能sedですか?または正規表現のみですか?

  • 最後から3行目以外のすべてを印刷するにはどうすればよいですか。これには2 tacの値が必要であり、それを数える必要がありsedますか?それともsed、後ろから数える方法はありますか?

回答:


12

パート1

単にd13行目を削除します。

sed '13d' <file.txt

上記を補完する一般的な方法は次のとおりです。

sed '13!d' <file.txt

パート2

それができるので:

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. ; 行を区切るために使用されますが、通常は機能するようですが、ラベルの後には機能しません
  2. BSD sed ;は、1行の{}コマンドグループの最後のコマンドの後に必要なようですが、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で動作するようです。


@jimmij SEネットワークの関連する質問についての他の回答は、head/ tailソリューションがソリューションよりもはるかに遅いことを示唆していsedます。ありがとう。
同型写像

3
@isomorphismesプログラムは、ファイル全体を調べない限り、ファイルの行数を知ることができません。それを回避する方法はありません。下から数える唯一の方法は、ファイルを逆にして上から数えるか、それを2回解析することです。したがって、ヘッド/テールは、それが可能な限り速くなります。
terdon

@isomorphismes ...彼ら(head/ tail)は彼らがすることをするために最適化されているからです。
peterph 2014

@isomorphismes-必要なすべてのパーツで編集
Digital Trauma

いいね!どういうわけかもっと複雑になると思っていたので、答えを変更する必要がありました。:)
peterph 2014
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.