sed: ファイルの最後の X 行を除くすべてを削除します

sed: ファイルの最後の X 行を除くすべてを削除します

他のツールでも可能ですが、 でファイルの最後の X 行を除くすべてを削除する方法を知りたいですsed

答え1

基本的に、これは tail をエミュレートすることになります。この例では、X = 20 です。次の例では、最後の 20 行を除くすべての行が削除されます。

sed -i -e :a -e '$q;N;21,$D;ba' filename

説明:

  • -e :aはaというラベルを作成します。
  • 次の -e:
    • $q - 最後の行の場合は終了し、パターンスペースを印刷します
    • N - 次の行
    • 21,$D - 行番号が >= 21 の場合に「D」コマンドを実行します (21,$ = 21 行目からファイルの末尾の $ まで)
    • ba - スクリプトの始まりであるラベル 'a' に分岐します。

答え2

sedこのようなタスクに関しては、かなり複雑です。またはtail、これをはるかに簡単にし、代わりに使用する必要があります。そうは言っても、grepawk可能。

以下の解決策は、sed と複数行の検索と置換

sed -ni '
    # if the first line copy the pattern to the hold buffer
    1h
    # if not the first line then append the pattern to the hold buffer
    1!H
    # if the last line then ...
    ${
            # copy from the hold to the pattern buffer
            g
            # delete current line if it is followed by at least X more lines
            # replace X-1 with the proper value
            s/.*\n\(\(.*\n\)\{X-1\}\)/\1/
            # print
            p
    }
' filename

コメントがなければ、気の利いたワンライナーになります。たとえば、最後の 10 行以外をすべて削除したい場合は、次のようにします。

sed -ni '1h;1!H;${;g;s/.*\n\(\(.*\n\)\{9\}\)/\1/;p;}' filename

答え3

の脚本に基づいてsed マニュアルのセクション 4.13次のようなことができます:

n=10

(( n > 1 )) && script='1h; 2,'$n'{H;g;}; $q; 1,'$((n-1))'d; N; D'
(( n > 1 )) || script='$!d'

sed -i "$script" infile

答え4

tac|sed|tac>&&(mv||cat>)

以下のコマンドスニペットは両方とも、実質的にすべてを削除します。最後5~/file1最後10|sed '1,5!d;'を次のように置き換えることができます|sed '1,10!d;'等々、ご都合に合わせて。

  1. tac ~/"file1" |sed '1,5!d;' |tac >"/tmp/file2" &&mv  "/tmp/file2"  ~/"file1"
  2. tac ~/"file1" |sed '1,5!d;' |tac >"/tmp/file2" &&cat "/tmp/file2" >~/"file1"

関連情報