Задача для sed конвертировать код из Mathematica в Matlab

Задача для sed конвертировать код из 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и т. д.

  • Для замены 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)нужной строкой вместо этого выражения.

Связанный контент