7

結果文字列でn個の一致したパターンを正確に繰り返す方法は?

次のテキストがある場合の例:

++ '[' -f /etc/bashrc ']'
++ . /etc/bashrc
+++ '[' '[\u@\h \W]\$ ' ']'
+++ '[' -z 'printf "\033]0;%s@%s:%s\007" "${USER}" "${HOSTNAME%%.*}" "${PWD/#$HOME/~}"' ']'
+++ shopt -s checkwinsize
+++ '[' '[\u@\h \W]\$ ' = '\s-\v\$ ' ']'
+++ shopt -q login_shell
+++ '[' 506 -gt 199 ']'
++++ id -gn

ここで、すべての「+」を3つのスペースに置き換えたいのですが、これはパターンの先頭でのみ発生します。私はを使用:<range>s/^<pattern> :%s/+/ /gしますが、テキストの残りの部分に「+」が含まれている場合は、単にそれを台無しにします。

質問:最初にすべての+を照合し、結果の文字列で見つかった+の同じカウントを繰り返すにはどうすればよいですか?期待される:

^   ++$  -> ^         $
^   +++$ -> ^            $
^   +$   -> ^      $

ありがとう

4

3 に答える 3

8

これを試して:

:%s/^+*/\=repeat('   ',strlen(submatch(0)))/

submatch(0)+行の先頭で一致したものがすべて含まれ、strlenそれらをカウントします。したがって、行の先頭にあるすべてのプラス記号に対して、。を使用して3つのスペースが挿入されrepeatます。

詳細については:

:help sub-replace-expression
:help repeat()
:help submatch()
:help strlen()
于 2012-08-07T13:26:06.243 に答える
3

この場合のエレガントな置換コマンドは次のとおりです。

:%s/\%(^+*\)\@<=+/   /g
于 2012-08-07T14:29:02.390 に答える
1

それが許容できるのであれば、式を数回実行する必要があると思います...

次のようなものを実行する必要があります(空白を表示するために使用される一重引用符を除く):

'^(\s*)+'

次のようなものに置き換えます(ここでも一重引用符を差し引いたもの)

'$1   '

正規表現で解決できるすべての問題が、単一の正規表現だけで解決できるわけではありません-これはそのようなケースの1つであると確信しています

この式/置換のペアは、行の先頭にあるプラス記号ごとに1回実行する必要があります(上記の例では、4回になります)。注:記述されているように、これは次の行を台無しにします。空白とプラス記号で始まることになっているので、それがどこでも起こらないことを願っています...

于 2012-08-07T13:22:40.237 に答える