1

特定のパターンに一致する行の最初の 10 文字を、上の行の最初の 10 文字と置き換えるにはどうすればよいですか?

編集:行内のどこにでも一致する可能性のある最初の10文字を置き換えるように求めているかどうかは明確ではなかったので、このケースを扱う場合は回答にメモしてください(このケースをBと意図したものと呼びますケースA?)

4

6 に答える 6

4

多分:

:%s/^\(.\{10}\)\(.*\n\)abcdefghij\(.*\)/\1\2\1\3/

「abcdefghij」は 2 行目の 10 文字の文字列です。

于 2009-05-07T11:50:14.300 に答える
3

次のようなものが機能します。

%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
于 2009-05-07T12:27:17.037 に答える
3
: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に蛙をくれた

これに:

マンゴー
を食べるのが好きカエルの足
食べるのが好き 子犬
がいたらいいのにカエル
がいたらいいのに
于 2009-05-07T12:35:08.763 に答える
2

そのような複雑なアクションがある場合は、通常、qコマンドを使用してマクロを記録します。(未テスト) のようなもの:

/<pattern>
qq
10x
k
10yl
j
P
n
q

そして、必要に@q応じてカウントを前に付けて、そのマクロを繰り返し発行します。

于 2009-05-07T11:52:33.080 に答える
1

検索と置換を使用できます。

:7,9 s/foo/bar/c

この例では、7行目から9行目まで、「foo」が出現するたびに検索し、「bar」に置き換えて、ヒットごとに確認を求めています。確認したくない場合は、最後にcをドロップします。あなたが適切と思う範囲を選んでください、そしてこれはあなたが望む場所にあなたを連れて行くはずです

于 2009-05-07T11:50:13.193 に答える
1

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 番目の残り

于 2009-05-07T11:53:31.953 に答える