특정 단어/문자는 포함하지만 다른 단어/문자는 포함하지 않는 줄 수정

특정 단어/문자는 포함하지만 다른 단어/문자는 포함하지 않는 줄 수정

특정 단어/문자는 포함하고 다른 단어/문자는 포함하지 않는 여러 파일에서 여러 줄을 수정하는 방법을 찾고 있습니다. 보다 구체적으로, 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)

  1. 문자열은 REAL즉시 따라오지 않습니다 (.
  2. ::같은 줄에 나중에 자리가 있어요.

내가 작성한 방식에 따르면 문자열 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

관련 정보