n番目からファイルの最後まで削除

n番目からファイルの最後まで削除

などのコマンドラインツールを使用してn番目のパターンが発生した後からファイルの終わりまでコンテンツを削除するにはどうすればよいですかsed?たとえば、次の
3 番目の項目を削除します。foo

something
foo1
maybe something else
foo2
maybe not
foo3 -this line and anything after is gone- 
I'm not here

$sed '/magic/'

望ましい結果:

something
foo1
maybe something else
foo2
maybe not

同じことを行いますが、3番目foo

答え1

予約された回線なし:

awk -v n=3 '/foo/{n--}; n > 0'

行を維持する:

awk -v n=3 'n > 0; /foo/{n--}'

3番目の項目を見つけたら、すぐに終了して読み取りを中止するように少し改善したい場合がありますfoo

awk -v n=3 '/foo/{n--; if (!n) exit}; {print}' # not-keep
awk -v n=3 '{print}; /foo/{n--; if (!n) exit}' # keep

sedもっと面倒です。 fooの発生は、予約されたスペースの文字数だけ維持する必要があります。たとえば、次のようになります。

維持する:

sed '
  /foo/{
    x;s/^/x/
    /x\{3\}/{
      x;q
    }
    x
  }'

保管されていません:

sed -ne '/foo/{x;s/^/x/;/x\{3\}/q;x;}' -e p

答え2

perl次のように受け入れるとコマンドラインツール、あなたもできます

perl -ne 'print unless $c>2; ++$c if /foo/' 
perl -ne '++$c if /foo/; print unless $c>2' 

予約の有無。

答え3

代替答え:vimでこれを行うことができます。 vimをテキストエディタまたはコマンドラインツールとして使用してこれを行うことができます。テキストエディタで(行を含めるか除く):

/foo<cr>2ndG:wq<cr>
/foo<cr>2njdG:wq<cr>

いくつかの重要な詳細:<cr>「入力する」を意味します。また、通常、<n-1>ndG「N」番目の発生後に削除する必要があります。 3つを求めて、例では2つを書きました。

コマンドラインでのみこれを実行できます。

vim -c "/foo" -c "normal 2ndG" -c "wq"
vim -c "/foo" -c "normal 2njdG" -c "wq"

この方法は正規表現でも機能します。このウェブサイト正規表現のvimスタイルの素晴らしい説明です。

関連情報