2

私がやろうとしているのは、特定のパターンについて多数のソースファイルを検索し、このパターンの要塞に別の式を入れることです。私が探しているファイルはすべて同じ拡張子*.F90です。私の最初のステップは、grepを使用して、allocateを含むが割り当てられていないファイルのすべての行を見つけることです。したがって、次のようになります。

grep –I “ allocate *(” *.F90 | grep –v allocated

私が抱えている最初の問題は、角かっこの前に1つ以上のスペースがある可能性があることです。私は持てます

 allocate( 
 or allocate ( 
 or allocate  (  

これが、grepコマンドに「*」が必要な理由です。ただし、一般的なルール(スペースを除く)では、allocateの後に「(」が続き、割り当てられるものが続きます。したがって、次のようになります。

allocate ( array_name ( .... 

スペースはオプションです。したがって、この文字列を見つけて、その前に次のように配置します。

If( allocated(array_name) ) deallocate(array_name)

そしてすぐに次の行で元の文字列が欲しいですallocate(array( … .

array_nameは英数字の文字列であり、置換後に複数の場所に表示されることに注意してください。これは、割り当てられているアレイの名前です。誰かが私にこれを行う方法のヒントを与えることができれば私は非常にありがたいです。私は立ち往生していて、それをどのように行うのか分かりません。

4

2 に答える 2

2

に置き換えたいという意味だと思いallocate ( array_name )ますIf( allocated(array_name) ) deallocate(array_name) allocate ( array_name )

GNUまたはBSDsedでは、次のことができます。

sed -i.bk -e '/allocated/t' \
  -e 's/allocate *( *\([A-Za-z0-9_]*\) *)/If( allocated(\1) ) deallocate(\1) &/' \
  *.F90

これにより、*。F90内の一致する行が検索および置換され、行がallocatedonにスキップされます。元のファイルは*.F90.bkと呼ばれます。

@Anders Johanssonが述べたように、割り当てる引数が英数字アンダースコアではない場合もあります。検索して置き換える前に、これを検索できます。

for i in *.F90; do
    echo "$i"
    sed -n '/.*allocate *( *\([^ )]*\) *).*/{h; s//\1/; /^[A-Za-z0-9_]*$/t
        x; p;}' "$i"
done

(後の改行に注意してください。BSDsedtはtの後のすべてをラベルとして解釈します)。bashでctrl+v ctrl + jを押して、コマンドラインに改行を入力します。

  • /a\(b\)c/文字列が一致する行を検索
  • h*h*マッチabcをホールドスペースに入れます
  • s//\1/*s*abc最初のグループとの最後の試合を代用b
  • / ^ [az] * $ / tb一致する場合^[a-z]*$は、スクリプトの最後に分岐します
  • xe * x*changeホールドスペースabcパターンスペースb
  • p* p*rintパターンスペースb
于 2013-01-10T22:28:27.127 に答える
1
cat old_file.txt | sed 's/allocate *( *\([a-zA-Z0-9_]*\)/If( allocated(\1) ) deallocate(\1)\
allocate(\1/' > new_file.txt
于 2013-01-10T22:36:52.160 に答える