Vimでそれを行う方法:
前:
aaa
bbb
ccc
ddd
eee
fff
後:
aaa
ccc
eee
Vimでそれを行う方法:
前:
aaa
bbb
ccc
ddd
eee
fff
後:
aaa
ccc
eee
回答:
これにはマクロを使用できます。以下をせよ。
gg
。qq
ます。dd
後を押します。q
ます。10000@q
PS:コマンドモードに移動するには、Escapeキーを数回押します。
:g/^/+d
ユーザーstackoverflow.com/users/254635/ib(以下)からこれを解決するためのよりエレガントな方法です。
タスクを実行するためのエレガントな(そして効率的な)方法は、 :+delete
コマンドを使用して、すべての行で現在の行の次の行を削除するコマンド:global
。
:g/^/+d
:1d|g/^/+d
、奇数行を削除します。
:normal
または:norm
を使用して、特定の通常モードコマンドを実行できます。ソース。
:%norm jdd
%norm ddj
奇数行を削除したいのになぜ動かないのか興味があります。
:map ^o ddj^o
^o
ここで^はCTRLを表します。2行ごとに行を削除する再帰マクロ。最初の行をうまく選択すれば完了です。
vimメールアーカイブから:
:let i=1 | while i <= line('$') | if (i % 2) | exe i . "delete" | endif | let i += 1 | endwhile
(vimコマンドラインで1行に入力すると、行1、3、5、7、...が削除されます)
!perl -ne 'print unless $. % 2'
:-)
if (expression)
3行ごとに機能する柔軟性のため
常にシェルコマンドを介してパイプすることができます。つまり、好きなスクリプト言語を使用できます。
:%!perl -nle 'print if $. % 2'
(または、必要な行に応じて、「if」の代わりに「unless」を使用します)
-l
Perlに切り替える必要はありません...また、awk
Perlよりも少し普及していると思いますが、最近はそれほど多くはなく、これをより短くすることができます::%!awk NR\%2
または:%!awk 1-NR\%2
他の行。
:%!awk -- '++c\%2'
あるいは
:%!awk -- 'c++\%2'
除草したい半分に応じて。
NR
変数を使用しないのですか?
:%!awk NR\%2
または:%!awk 1-NR\%2
、別のコメントで投稿したとおり。それはほとんど長くありません。
1-NR
より長いですc++
。はい、私はそれが1つのキャラクターであることを知っています。私が言ったように、本当の理由は私がそれを忘れていたということです。とにかく、人々はここのawkの美しさを理解していないようです。
NR
より短い++c
Vim独自の検索機能と置換機能を次のように使用できます。最初の行にカーソルを置き、通常モードで入力します。
:.,/fff/s/\n.*\(\n.*\)/\1/g
.,/fff/
置換の範囲です。これは、「この行から正規表現に一致する行fff
(この場合は最後の行)までを意味します。s///
代替コマンドです。正規表現を探し、出現するすべてを文字列に置き換えます。のg
最後の手段では、限り、正規表現が発見され続けて置換を繰り返します。\n.*\(\n.*\)
は改行に一致し、次に行全体(.*
改行を除く任意の数の文字に一致)、次に別の改行および別の行に一致します。括弧\(
と\)
その中の式が記録されるので、後で使用することができます\1
。\1
グループ化された改行とその後ろに行を挿入します。これは、次の行も削除したくないためです。置換メカニズムが通過するようにしたいだけなので、次の置換で削除しません。この方法で、削除を実行する範囲を制御でき、外部ツールを使用する必要はありません。
$
代わりに/fff/
、ファイルの内容に関係なくファイルの終わりを示します。
別のアプローチとして、vimがサポートしている場合はpythonを使用することもできます。
:py import vim; cb = vim.current.buffer; b = cb[:]; cb[:] = b[::2]
b = cb[:]
現在のバッファのすべての行を一時的ににコピーしb
ます。b[::2]
バッファから2行おきに取得し、それを現在のバッファ全体に割り当てcb[:]
ます。へのコピーb
バッファオブジェクトは拡張スライス構文をサポートしていないようなので、が必要です。
これはおそらく「vimの方法」ではありませんが、Pythonを知っていれば覚えやすいでしょう。
奇数行(1,3,5、..)を削除するには-> :%s/\(.*\)\n\(.*\)\n/\2\r/g
偶数行を削除するには(2,4,6、..)-> :%s/\(.*\)\n.*\n/\1\r/g
テキスト(1行目を形成)に続いて改行文字を検索し、さらにテキスト(2行目を形成)に続いて別の改行文字を検索し、上記を最初の一致(奇数行)または2番目の一致(偶数行)に置き換えますその後に改行が続きます。
あなたはvimでこれを試すことができます
:1,$-1g/^/+1d
もっと明確にしようと思います(2つの部分)
最初の部分は選択範囲(:from,to
)
2番目の部分はアクション(d
削除)
:1,$-1
))g
)+1d
次の行を削除()ファイルの最初の行に移動して実行:+1d
すると、次の行が消えます。
泥だらけだと知っていますが、vimで動作します