Mathematica에서 Matlab으로 코드를 변환하는 데 어려움을 겪었습니다.

Mathematica에서 Matlab으로 코드를 변환하는 데 어려움을 겪었습니다.

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최종적인 의미는글로벌, 이는 모든 일치 항목에 대체가 적용되도록 합니다.

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

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

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

답변2

사용할 수 있는 sed문자열 대체 기능은 다음과 같습니다.

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

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

관련 정보