sedの一番下からN行目以外のすべてを印刷するには?

sedの一番下からN行目以外のすべてを印刷するには?
  • 私は次の補完/「反対」をしたいです

    sed 13q;d <file.txt
    

    より一般的には、これらの報酬/逆/反対演算を実行することは可能ですかsed?それとも正規表現に固有のものですか?

  • 最後の行から3行目を除くすべての内容を印刷するにはどうすればよいですか?これには2ビットが必要tacで、今後計算する必要がありますかsed?それともsed後ろから計算する方法がありますか?

答え1

パート1

13行目を削除してくださいd

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 

Glen Jackmanの貴重な追加:

それは「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で動作するようです。

関連情報