1

このように、数行のテキストがあります

text1*textX*,text2

**マーカー間のテキストを行頭に移動したいので、次のようになります

textX "text1" "text2"

コマンドラインでそれを行うにはどうすればよいですか?

4

4 に答える 4

2

以下のコマンドを試してください:

s/^\(.*\)\*\(.*\)\*/\2 \1/

text1*textX*,text2 を textX text1,text2 に変更します

于 2012-05-19T19:21:08.977 に答える
1

リテラルがある場合 * [*] の中に入れる必要があります

:%s,\v^([^ ]*)\s\+([^ ]*).*,\2 \1,g

: ................. command
% ................. whole file
s ................. replace
^ ................. begining of line
, ................. search and replace delimiter (comma exchanging by bar)
\v ................ very magic, see :h very-magic
([^ ]*) ........... group 1 (group here) everything except space
\s\+ .............. one or more spaces
([^ ]*) ........... group 2 (group here) everything except space
\s\+ .............. one or more spaces
.* ................ zero or more characters

\2 ................. back reference to group 2
\1 ................. back reference to group 1
, .................. ending replace
g .................. global 
于 2012-05-19T21:01:36.903 に答える
1

別のアプローチ...

上記のサンプルでは、​​(通常モードで)次のようにします。

0dt*f*p

. 0     :    goes to start of line
. d     :    starts delete (waits for movement or text object)
. t*    :    moves the cursor to the first asterisk and yanks the deleted text to the unnamed register
. f*    :    moves the cursor to the second asterisk
. p     :    pastes the contents of the unnamed register immediately after the second asterisk

参考文献:

:h f
:h t

当然のことながら、これら 2 つのコマンドの力を思い出すことができるようになるまでには少し練習が必要であり、実際の状況でそれらを使用できるようになるためです。

Vim のコマンド ラインで正規表現を入力するよりも、この方法の方が効果的である場合があります。

数行以上:

qzq:@=n 

ここで、n は反復係数です。

于 2012-05-21T00:18:30.653 に答える
0

Niraj Nawanit の答えはあなたが探しているものを提供するかもしれませんが、これはまさにあなたが求めていたものを提供します:

%s/\([^*]*\)\*\(.*\)\*,\([^[:space:]]*\)/\2 "\1" "\3"/
于 2012-05-19T21:39:38.763 に答える