2017-09-03 11 views
0

;\s*\<do\>をVimの\rdoに置き換える必要があります。ただし、;\s*\<do\>は、その前にFortranのコメント記号!がある場合、つまり検索パターン!.*;\s*\<do\>にある場合、置換されないようにする必要があります。例えば、非コメント行パターンを特定の条件に置き換える

j=2; do i=1, 10 

; doは、交換してはならない以下のコメント部分で

j=2 
do i=1,10 

しかし; doとして

k=3 ! j=2; do i=1, 10 

を交換する必要があります私はこれを行うことができますどのようにvimで?私は\(!.*\)\@!;\s*\<do\>を試しても動作しません。

+1

入力ファイルの例と予想される出力を投稿できますか? –

+0

私はあなたがここでこの質問をするべきではないと思います、スーパーユーザーはもっと良い場所になるかもしれません – Sinapse

+1

https://vi.stackexchange.com/でもvi(m)に関する質問は常に受け入れられています... –

答えて

3

私はあなたの例に基づいてこの答えを編集した:

:g!/<pattern1>/s/<pattern2>/<replacement>/gを使用してみてください:

:g!/!.*/s/\v;\s*do/\rdo/g 

これだけpattern1を含まない行にreplacementpattern2の交換を行います。

オリジナルの答え:

次のパターンは、あなたが要求した何をすべき:/[^*]\{0,1\}\zs;\\s\*\\<do\\>。 あなたはそれをあなたの望むものに置き換えることができます。 %s/<pattern>/\rdo/g

+0

先頭の '/'は検索コマンドであり、実際の正規表現の一部ではありません。 – avivr

+0

これは動作しません。たぶん私は適切にフレーズの質問をしません。 '!。*; \ s * \ 'とは、検索パターンを意味します。更新された質問を参照してください。 –

+0

申し訳ありませんが、例を追加する前に、リテラル検索パターンを置き換えようとしていたようです。 – avivr

0
:v/!/ s/; /\r/g 

:v .......... global negation (all lines without pattern) 
/!/ .......... all lines not containing ! 
s ............ substitution 
; ............ semicolon space 
\r ........... Carriage return "Enter" 
関連する問題