
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)
해당 표현식 대신 원하는 문자열로 바꾸면 됩니다.