11

vim でファイルの先頭から 4 行目から 6 行目を削除 (または置換、ヤンクなど) できるのと同じように:

:4,6d 

ファイルの最後から4行目から6行目までを削除(または置換、ヤンクなど)したいです。つまり、ファイルに 15 行ある場合は、次のようにします。

:10,12d

しかし、ファイルに含まれる行数がわからない場合、これを行うことはできません。私は、多数のファイルのバッチでこれを使用します。vimとsedでこれを行うにはどうすればよいですか?

私は実際にこの投稿を見ましたが、役に立たなかった.

4

5 に答える 5

10

まあ、vimあなたを使って次のことを試すことができます-とにかく非常に直感的です:

:$-4,$-5d

今、sed私はそれを行う正確な方法を見つけることができませんでしたが、 以外のものを使用できる場合は、 と を使用sedした解決策がheadありtailます:

head -n -4 file.txt && tail -2 file.txt
于 2013-01-02T01:20:41.890 に答える
7

Vim では、最後の行を表す から行番号を引くことができます$。たとえば、これは最後の 3 行で機能します。

:$-2,$substitute/...

sed では、これはそれほど簡単ではありません。これは、文字のストリームで機能し、単純に戻ることができないためです。最後に見た行の数をホールド スペースに保存し、ストリームの最後にホールド スペースで作業する必要があります。sed1line.txtからのいくつかのレシピを次に示します。

# print the last 10 lines of a file (emulates "tail")
sed -e :a -e '$q;N;11,$D;ba'

# print the last 2 lines of a file (emulates "tail -2")
sed '$!N;$!D'

# delete the last 2 lines of a file
sed 'N;$!P;$!D;$d'

# delete the last 10 lines of a file
sed -e :a -e '$d;N;2,10ba' -e 'P;D'   # method 1
sed -n -e :a -e '1,10!{P;N;D;};N;ba'  # method 2
于 2013-01-02T01:23:05.143 に答える
6

ファイルの最後から 4 行目から 6 行目まで: ファイルtacを反転するために使用します。

tac filename | sed 4,6d | tac
于 2013-01-02T02:43:57.290 に答える
2

awk で 2 つのパスを使用できます。最初のパスは行数をカウントし、2 番目のパスは好きな行を印刷または削除します。

awk 'NR==FNR{numLines++;next} {fromEnd = numLines - FNR} fromEnd > 6 || fromEnd < 4' file file

awk 'NR==FNR{numLines++;next} {fromEnd = numLines - FNR} fromEnd < 6 && fromEnd > 4' file file
于 2013-01-02T21:10:39.080 に答える
1

これはうまくいくかもしれません(GNU sed):

sed -r ':a;${s/([^\n]*\n){3}//;q};N;7,$!ba;P;D' file

これは、パターン スペース (PS) で 6 行の移動ウィンドウを作成し、最後の行に遭遇したときにそれらの最初の 3 つを削除することによって機能します。

  • :aループラベルです
  • ${s/([^\n]*\n){3}//;q}ファイルの最後にある PS の最初の 3 行を削除して終了します。
  • N改行を追加してから、次の行を PS に追加します。
  • 7,$!ba'への行である(ファイルの最後)への行でない場合は、最初のラベルにループバックします7$16:a
  • P;D7(ファイルの終わり)までの行範囲については$、PS の最初の改行まで印刷し、最初の改行まで削除し、新しいサイクルを開始します。

1最後から 2 番目の句は、行が6PS に追加されるという点で、デフォルトでウィンドウを作成します。行7から最後まで行が最後に追加され、最初の行が印刷されてから削除されます。

または:

sed -e ':a' -e '$s/\([^\n]*\n\)\{3\}//' -e '$q' -e 'N' -e '7,$!ba' -e 'P' -e 'D' file
于 2013-01-02T13:20:15.467 に答える