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)
해당 표현식 대신 원하는 문자열로 바꾸십시오.