2017-08-27 8 views
0

のインデントを維持しながら、私は、様々なFortranのファイルには、次のループの構文を交換したいと思います2つのワードでライン上の2つの単語を置き換えsedコマンド秒1

私が "やる" ことで " do number," を置き換えるに成功
do k=0,size_z+1 
    do j=0,size_y+1 
    write(5,1000,advance='no') (x0(i,j,k),i=0,size_x) 
    write(5,999,advance='no') x0(size_x+1,j,k) 
    write(5,*) 
    end loop 
    if(k.ne.(size_z+1)) then 
    write(5,*) 
    endif 
    end loop 

sed "s/do\s[0-9]*,/do/g" 

、私は、rしたいと思います比較的この「continue」に対応するループの「do」キーワードに「continue」(のくぼみに等しい「end loop」のインデントを設定して「end loop」によってeplace「30 continue」および「40 continue」(所望交換上記参照)。

残念ながら、私は良いインデントでこの結果を得る専門家ではありません。だから私は、ソリューションを使用したい

1000 format(1000(f15.11,1x)) 
1001 format(' Convergence = ',f11.9,' after ',i9,' steps ') 
1002 format(' Wall Clock = ',f15.6) 

すべてのヘルプは大歓迎です、私のファイルで

UPDATE 1

について、私はこのような行を持っていることに気づきました与えられて同時に数字で始まり、 "format("を含む行の置換を除外する

上記の解決方法を維持しながら、このパターンの除外方法を知りません。私は試しました:

sed -e 's:\(\s*do\s*\)[0-9]*,\s*:\1:' \ 
    -e '/^[0-9]/ s:[0-9 ]: :g' \ 
    -e '/format(/!s:continue:end loop:' 

しかし、これは動作しません。私が取得:

 format( (f . , x)) 
    format(' Convergence = ',f . ,' after ',i ,' steps ') 
    format(' Wall Clock = ',f .) 

おかげで、次のように

答えて

0

使用sed

sed -e 's:\(\s*do\s*\)[0-9]*,\s*:\1:' \ 
    -e '/continue/ s:[0-9 ]: :g' \ 
    -e 's:continue:end loop:' infile 
  1. 's:\(\s*do\s*\)[0-9]*,\s*:\1:'
    • \s*一致するゼロまたはそれ以上の空白
    • \s*do\s*マッチ周り
    • [0-9]*,\s*ゼロ以上の数字コンマに続くゼロ以上の空白とdo,ゼロまたはそれ以上の空白
    • \(...\)back reference
  2. '/continue/ s:[0-9 ]: :g'として\1と一致群として\(\s*do\s*\)一致させるです。

    • /continue/マッチ線ワードを継続している場合、次いで
    • s:[0-9 ]: :g'する各数値を置き換えスペース自体を含む単一のスペースで、これらの行のインデントを維持します
  3. 's:continue:end loop:'あなたは、文字列の一部ではないか、あなたはそれを逃れることができるの区切り文字の代わりに、:として任意の文字を使用することができますend loop

  4. continueを交換してください。
+0

- @ AFSHINありがとう、それは動作します。私は "**:**"文字の使用を知らなかった... '/^[0-9]/s:[0-9]::g'は何を説明できますか?あなたは** sed "s/pattern1/pattern2/g" **のようなスラッシュ文字を使ってみませんか?よろしくお願いいたします。 – youpilat13

+0

- @ AFSHIN私は数字で始まる行もありますので、これらの行は変更しないでください。私の** UPDATE 1 **、ありがとうございます – youpilat13

+0

、^[0-9]/'part to'/continue/'、私はあなたに_continue_という別の行があるとは言いませんでした:D次に'/^ [0-9]。* continue/' –