
У меня есть следующий вывод из кода 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
и т. д.Для замены
Complex(a, b)
я используюComplex(\([^,]*\), *\([^)]*\))
. Это означает совпадениеComplex(
, затем самая длинная строка последовательных не-,
символов ([^,]*
) фиксируется как \1, затем одна запятая и ноль или более пробелов, затем самая длинная строка не-)
символов, пока не будет найдена закрывающая скобка. Все это заменяется на(\1 + i*\2)
.Регулярное выражение, которое соответствует,
Power()
по сути, то же самое.
решение2
Вы можете использовать sed
функцию замены строки:
sed -i 's/"complex(a, b)"/(a + i*b)/g'
То же самое и для другого шаблона, просто замените complex(a,b)
выражением, которое вы хотите заменить, и (a + i*b)
нужной строкой вместо этого выражения.