특정 단어/문자는 포함하고 다른 단어/문자는 포함하지 않는 여러 파일에서 여러 줄을 수정하는 방법을 찾고 있습니다. 보다 구체적으로, a는 포트란 파일의 모든 변수 선언을 에서 으로 변환하려고 합니다 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