特定のパターンに一致する行の最初の 10 文字を、上の行の最初の 10 文字と置き換えるにはどうすればよいですか?
編集:行内のどこにでも一致する可能性のある最初の10文字を置き換えるように求めているかどうかは明確ではなかったので、このケースを扱う場合は回答にメモしてください(このケースをBと意図したものと呼びますケースA?)
多分:
:%s/^\(.\{10}\)\(.*\n\)abcdefghij\(.*\)/\1\2\1\3/
「abcdefghij」は 2 行目の 10 文字の文字列です。
次のようなものが機能します。
%s/^.\{10\}/\=strpart(get(getbufline("", line(".")-1), 0, ""), 0, 10)/
^.\{10\}
あなたの実際のパターンはどこですか。
%s/ # substitute all lines matching…
^.\{10\} # your pattern
/ # …with…
\= # an expression:
strpart( # gets the part of a string
get( # gets an element of a list
getbufline( # gets a list of lines from the current buffer
"", line(".")-1) # getbufline() the line before the current line
, 0, "") # get() first line in buffer, default to ""
, 0, 10) # strpart() first ten characters
/ # …end of substitution
:2,$g/<pattern>/s/^.\{10}/\=strpart(getline(line(".")-1),0,10)
2,$
範囲です(最初の行には前の行がないため)g//
特定のパターンに一致する行でコマンドを実行できます。s/^.\{10}/
行の最初の 10 文字を置き換えます\=
vim 式の結果を:s//
line(".")
は現在の行番号ですgetline(line(".")-1)
前の行のテキストですstrpart(getline(line(".")-1),0,10)
前の行の最初の 10 文字たとえば、次の2,$g/frog/s/^.\{10}/\=strpart(getline(line(".")-1),0,10)
ように変更されます。
蛙の足 を揚げる前にマンゴー を食べるのが好き子犬 がいたらいいのに彼女はDに蛙をくれた
これに:
マンゴー を食べるのが好きカエルの足 を食べるのが好き 子犬 がいたらいいのにカエル がいたらいいのに
そのような複雑なアクションがある場合は、通常、q
コマンドを使用してマクロを記録します。(未テスト) のようなもの:
/<pattern>
qq
10x
k
10yl
j
P
n
q
そして、必要に@q
応じてカウントを前に付けて、そのマクロを繰り返し発行します。
検索と置換を使用できます。
:7,9 s/foo/bar/c
この例では、7行目から9行目まで、「foo」が出現するたびに検索し、「bar」に置き換えて、ヒットごとに確認を求めています。確認したくない場合は、最後にcをドロップします。あなたが適切と思う範囲を選んでください、そしてこれはあなたが望む場所にあなたを連れて行くはずです
vimのモーションとヤンク/ペーストのみを使用..ファイルの内容が..
1234567890abcdef
qwertyuiopasdfgh
カーソルを q, に置くと10x
、ファイルは次のようになります。
1234567890abcdef
asdfgh
カーソルを最初の行に移動し (を使用k
します)、次に実行します10yl
(10 文字をヤンクします) 。
次に、1 行下に移動してj
貼り付けP
(カーソルの下に貼り付ける場合は大文字)、ファイルは次のようになります。
1234567890abcdef
1234567890asdfgh
つまり、カーソルを q から開始します。
10xk10yljP
..貼り付けるか、マクロに割り当てることができます
上書きで貼り付ける明白なショートカットがあればもっと短いのですが、そんなの見つけられませんでした
もう1つのオプションは、信じられないほどわかりにくい正規表現の検索/置換です..
Visual-line で 2 つのターゲット行を選択し、次の検索と置換を実行します。
:'<,'>s/\(\(.\{10\}\).*\)\n\(.\{10\}\)\(.*\)$/\1\r\2\4/
基本的には引っかかる..
\1
- 最初の行全体\2
- 最初の 10 文字 (ネストされたグループ内)\3
- 2 行目の最初の 10 文字\4
- 2行目の残り次に、2 行を次のように構成します\1\n\2\4
- 完全な最初の行、改行、最初の 10 文字、2 番目の残り