外部フィルターとしてEx
使用するコマンドでこれを行うこともできsed
ます:
:%!sed -n 'h;n;G;h;n;G;h;n;G;p'
このバージョンは、4の倍数を超える余分な行を無視(削除)します。4行未満の最後のセット(保持)を保持するには、次を使用します。
:%!sed -n '$p;h;n;G;$p;h;n;G;$p;h;n;G;p'
%
ここでは、「バッファ内のすべての行」を意味します。
この!
コマンドは、「指定された行を入力として次のコマンドを実行し、指定された行をコマンドの出力に置き換える」ことを意味します。(これはフィルターと呼ばれます;並べ替えなどに非常に便利です。たとえば、:%!sort
ファイル内のすべての行:2,8!sort
を並べ替えます; 行2〜8などを並べ替えます)
sed
はストリームエディタツールであり、すべてのUnixライクシステムで使用されています。sed
ここで使用される重要な概念は、「パターンスペース」(デフォルトでは入力の各行を順番に含む)と「ホールドスペース」(使用中に余分なテキストを貼り付けてsed
他の処理中に保存する場所)です。入力行)。
-n
sed
パターンスペースを印刷するデフォルトのアクションを抑制するコマンドのオプションです(この場合、明示的に指定した場合にのみ印刷したいため)。
$p
sed
コマンド内の「sed
入力の最後の行にいる場合、印刷(パターンスペース)」を意味します。
h
「「パターンスペース」の現在の内容を「ホールドスペース」に貼り付け、そこにあるものを上書きする」という意味です。
n
「「パターンスペース」の内容を入力の次の行に置き換える」という意味です。
G
は、「「パターンスペース」に追加します。「ホールドスペース」の内容が続く改行。」
すべてをまとめると、sed
コマンドは4行の出力を保存し、保存するときにそれらを反転してから印刷します。$p
第二のバージョンに追加のコマンドがファイルの最後の行が4行の倍数に以外に達した場合、ラインがまだ印刷されていることを確認します。
Vim固有の機能を使用せず、外部フィルターも使用しない、代替の対話型アプローチの場合:
:4
4行目に移動します。
:.m -4 | +3m . | +2m . | +5
前の4行(1〜4)を逆にして、カーソルを8行目に残します。
.m -4
わずかに移動現在の行を後行4行バック(移動行にカーソルを残します)。
+3m .
現在の行の3行後の行を現在の行の直後に移動し、移動した行にカーソルを置きます。 +2m .
もちろん同じように機能します。
+5
カーソルを現在の位置から5行下に置きます。
必要に応じて繰り返します。
Vim @:
では、このコマンド全体をで繰り返し、次にで繰り返し@@
ます。POSIXではvi
またはex
あなたする必要があります挿入 :.m -4 | +3m . | +2m . | +5
、テキストの行としてという名前のバッファ(レジスタ)にそれを削除し、その名前のバッファ(レジスタ)を実行します。
そのため、ex
モードでは、POSIX指定の機能のみを使用して対話的に行を反転し、17行のテキストから開始します。
Entering Ex mode. Type "visual" to go to Normal mode.
:0a # Append following text after "line 0" (i.e. insert at start of file).
.m -4 | +3m . | +2m . | +5
. # End text insertion
:d k # Delete that line to register k
line1 # This is a printout of the current line
:4 # Move to line 4
line4
:@k # Execute register k to reverse lines 1-4
line8
:@@ # Execute register k again
line12
:@@ # Execute register k again
line16
:@@ # Execute register k again
line17
:%p # Print the whole buffer (just to see what was done)
line4
line3
line2
line1
line8
line7
line6
line5
line12
line11
line10
line9
line16
line15
line14
line13
line17
:wq # Save and quit
参考文献: