特定の単語/文字は含まれ、他の単語/文字は含まれていない複数のファイルから複数行を変更する方法を探しています。具体的には、aはFortranファイルのすべての変数宣言をからに変換しようとしますreal
。real(kind=r8)
たとえば、次の行は次のようになります。
var= (var1*REAL(j)-var2*REAL(j)*var3)
REAL :: pwr10
INTRINSIC REAL
REAL(kind=r16) :: qr(n), qaorg, qx
REAL, DIMENSION(-1:nx, -1:ny) :: arg1
REAL(kind=r8) :: y3
次のようにする必要があります。
var= (var1*REAL(j)-var2*REAL(j)*var3)
REAL(kind=r8) :: pwr10
INTRINSIC REAL
REAL(kind=r16) :: qr(n), qaorg, qx
REAL(kind=r8), DIMENSION(-1:nx, -1:ny) :: arg1
REAL(kind=r8) :: y3
grepを使用して特定の行を選択する方法を知っていますが、sedを使用して変更する方法はありません。誰でも助けることができますか?
答え1
$ sed 's/REAL\([^(].*::\)/REAL(kind=r8)\1/' file
var= (var1*REAL(j)-var2*REAL(j)*var3)
REAL(kind=r8) :: pwr10
INTRINSIC REAL
REAL(kind=r16) :: qr(n), qaorg, qx
REAL(kind=r8), DIMENSION(-1:nx, -1:ny) :: arg1
REAL(kind=r8) :: y3
表現sed
方式
s/REAL\([^(].*::\)/REAL(kind=r8)\1/
すべてREAL
次へ交換REAL(kind=r8)
- 文字列は
REAL
すぐには続きません(
。 ::
同じ行に後で席があります。
私が書いた方法によると、文字列は行REAL
のどこにでも現れることがあります。単語が行の最初に表示される場合(行の先頭と単語の間にスペースや何もありません)、代替式の最初の^REAL
単語が使用されます。REAL
答え2
perl -pe '/\h::\h/ && /^\h*REAL(?!\()\K/ and s//(kind=r8)/' input.txt
読む:
- 各行にスペースで区切られた "::" 部分文字列がある場合。
- 「REAL」というキーワードは行の先頭から始まり、前のスペースを選択でき、右側の左括弧は表示されません。
- 上記の両方の条件が満たされたら、交換を実行します。
- s//(kind=r8)/ コマンドは、最後に成功した正規表現一致を使用し、これを RHS にあるものに置き換えることを意味します。
出力
var= (var1*REAL(j)-var2*REAL(j)*var3)
REAL(kind=r8) :: pwr10
INTRINSIC REAL
REAL(kind=r16) :: qr(n), qaorg, qx
REAL(kind=r8), DIMENSION(-1:nx, -1:ny) :: arg1
REAL(kind=r8) :: y3