Mathematica에서 Matlab으로 sed 변환 코드에 대한 과제

Mathematica에서 Matlab으로 sed 변환 코드에 대한 과제

Mathematica에서 C 코드로 다음과 같은 결과가 출력됩니다.

$ cat file.txt
Complex(1.3, 2.7)*Power(kappa, 2.0) + Complex(0.3, 2.0)*Power(kappa,5.0)*log(alpha)

파일이 매우 깁니다(수만 줄). 모든 Complex(a, b)를 (a + i*b)로 바꾸고 모든 Power(a, b)를 a^b로 바꾸고 싶습니다. 따라서 위의 샘플은 다음과 같습니다.

$ cat desired_file.txt
(1.3 + i*2.7)*kappa^2.0 + (0.3 + i*2.0)*kappa^5.0*log(alpha)

이 결과를 얻으려면 sed를 어떻게 사용할 수 있습니까? 정규식과 예제를 읽어보면 전혀 간단하지 않습니다.

을 사용하여 어떻게 이 작업을 수행할 수 있습니까 sed?

답변1

이렇게 해야 합니다:

sed 's/Complex(\([^,]*\), *\([^)]*\))/(\1 + i*\2)/g; 
     s/Power(\([^,]*\), *\([^)]*\))/\1^\2/g' file

중첩된 문에서는 작동하지 않습니다.좋다 Power(Power(a, b), c).

설명

  • 의 패턴을 대체하려면 sed대체 연산자( s/pattern/replacement/)를 사용합니다. g마지막에 있는 뜻은글로벌, 모든 일치 항목에 대체가 적용됩니다.

  • 패턴은 다음과 같습니다.캡처나중에 이스케이프된 괄호 안에 넣어서 재사용합니다: \(and \). 첫 번째 패턴은 \1, 두 번째 \2등 입니다.

  • 을 교체하려면 Complex(a, b)을 사용합니다 Complex(\([^,]*\), *\([^)]*\)). 이는 match 를 의미하며 , 연속된 비 문자( ) Complex(의 가장 긴 문자열은 \1로 캡처되고, 단일 쉼표와 0개 이상의 공백, 닫는 괄호를 찾을 때까지 가장 긴 비문자 문자열이 캡처됩니다. 전체가 으로 대체됩니다 .,[^,]*)(\1 + i*\2)

  • 일치하는 정규식은 Power()본질적으로 동일합니다.

답변2

sed의 문자열 바꾸기 기능을 사용할 수 있습니다 .

sed -i 's/"complex(a, b)"/(a + i*b)/g'

다른 패턴도 마찬가지입니다. complex(a,b)바꾸려는 표현식과 (a + i*b)해당 표현식 대신 원하는 문자열로 바꾸면 됩니다.

관련 정보