質問
特定のパターンに一致する行の最初の10文字を上の行の最初の10文字に置き換えるにはどうすればよいですか?
編集:一致が行内のどこにでも現れる可能性がある最初の10文字を置き換えるように求めているかどうかは明確ではなかったので、このケースを扱う場合は回答にメモを作成することができます(このケースBと意図した1つのケース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(&quot;。&quot;)
は現在の行番号です -
getline(line(&quot;。&quot;)-1)
は前の行のテキストです -
strpart(getline(line(&quot;。&quot;)-1)、0,10)
は前の行の最初の10文字です
たとえば、 2、$ g / frog / s / ^。\ {10} / \ = strpart(getline(line(&quot;。&quot;)-1)、0,10)
変更されます:
I like eating mangos before frying frogs legs I wish I had a puppy She gave Dad a frog
これへ:
I like eating mangos I like eating frogs legs I wish I had a puppy I wish I had a frog
このような複雑なアクションがある場合、通常は q
コマンドを使用してマクロを記録します。 (未テスト)のようなもの:
/<pattern>
qq
10x
k
10yl
j
P
n
q
そして、そのマクロを @q
として繰り返し発行します。オプションでカウントが先頭に付きます。
検索と置換を使用できます:
:7,9 s/foo/bar/c
この例では、「foo」が出現するたびに7行目から9行目を検索し、「bar」に置き換えて、各ヒットの確認を求めています。確認したくない場合は、最後にcをドロップします。適切な範囲を選択してください。これで目的の場所に移動できます
vimのモーションとヤンク/貼り付けのみを使用します。ファイルの内容を指定します。.
1234567890abcdef
qwertyuiopasdfgh
q、 10x
にカーソルを置くと、ファイルは次のようになります。
1234567890abcdef
asdfgh
カーソルを最初の行に移動し( k
を使用すると実行されます)、次に 10yl
(10文字を右に移動します)
次に、1行下に移動して j
、 P
(大文字、カーソルの下に貼り付ける)を貼り付けると、ファイルは次のようになります。
1234567890abcdef
1234567890asdfgh
要するに、カーソルをqに置くことから始めます:
10xk10yljP
..これを貼り付けるか、マクロにを割り当てることができます
上書きによる貼り付けの明らかなショートカットがある場合は短くなりますが、そのようなものは見つかりませんでした
もう1つのオプションは、非常にわかりにくい正規表現の検索/置換です。
ビジュアルラインで2つのターゲット行を選択し、次の検索と置換を実行します。
:'<,'>s/\(\(.\{10\}\).*\)\n\(.\{10\}\)\(.*\)$/\1\r\2\4/
基本的にはつかむ..
-
\ 1
-最初の行全体 -
\ 2
-最初の10文字(ネストされたグループ内) - 改行
-
\ 3
-2行目の最初の10文字 -
\ 4
-2行目の残りの部分
次に、2行を \ 1 \ n \ 2 \ 4
として構築します-最初の行、改行、最初の最初の10文字、2番目の残りの部分を完了します