このように、数行のテキストがあります
text1*textX*,text2
**マーカー間のテキストを行頭に移動したいので、次のようになります
textX "text1" "text2"
コマンドラインでそれを行うにはどうすればよいですか?
このように、数行のテキストがあります
text1*textX*,text2
**マーカー間のテキストを行頭に移動したいので、次のようになります
textX "text1" "text2"
コマンドラインでそれを行うにはどうすればよいですか?
以下のコマンドを試してください:
s/^\(.*\)\*\(.*\)\*/\2 \1/
text1*textX*,text2 を textX text1,text2 に変更します
リテラルがある場合 * [*] の中に入れる必要があります
:%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
別のアプローチ...
上記のサンプルでは、(通常モードで)次のようにします。
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 は反復係数です。
Niraj Nawanit の答えはあなたが探しているものを提供するかもしれませんが、これはまさにあなたが求めていたものを提供します:
%s/\([^*]*\)\*\(.*\)\*,\([^[:space:]]*\)/\2 "\1" "\3"/