Замена определенных команд с круглой скобкой/скобками при хранении содержания (CLI)

У меня есть a plain text файл с LaTeX команды как \hspace{5cm}. Преобразовать этот файл в .odt некоторые мои пользовательские команды не преобразовываются правильно. Таким образом, я хочу автоматически найти и заменить определенные команды, но сохранять содержание скобок (подразумевать, что я хочу сохранить большинство команд и просто удалить некоторых). Я знаю, что могу просто открыться gedit и сделайте замену вручную, но это для сценария для повторной, автоматической замены.

Я уже искал это, но до сих пор только нашел, что ответы удалили скобки при сохранении там довольным (cf. здесь, здесь)). Я также посмотрел на некоторые введения в sed (например, здесь или здесь) без любого успеха.

Пример:

This is my \textbf{text} where there are about \prc{5} commands, i.e. \mErrRange{30}{20}{m}.

Так, так как это процент и диапазон ошибок, я хочу удалить команду и фигурные скобки и получить что-то вроде этого (хранение \textbf{...} команда):

This is my \textbf{text} where there are 5 % commands, i.e. 30 ± 20 m.

Что я попробовал до сих пор:

Различные способы использоватьsed, как:

sed -i -e 's/\\prc{\(.*\)}/\1%/g' hello.txt

Это уже дает мне:

This is my \textbf{text} where there are about 5} commands, i.e. \mErrRange{30}{20}{m%.

(Замена последней фигурной скобки в строке, но отъезда другого в его месте.)

Так, теперь у меня нет подсказки, как продолжить это. Возможно, я должен использовать другой инструмент вместо sed?! Я доволен любым предложением, работающим на Ubuntu и в terminal не устанавливая слишком много.

1
задан 5 February 2018 в 15:41

1 ответ

Вот путь:

sed 's/\\prc{\([^}]*\)}/\1 %/g'

Это получит все в скобках после \prc и сохраните его в группе 1, можно использовать это для замены команды содержанием скобок. [^}]* просто берет все кроме закрывающей скобки здесь. g обозначает “глобально” и означает, что это заменит всеми происшествиями шаблона в строке вместо просто первой – Вы захотите это для каждого выражения в Вашем случае.

Что касается другого, просто используйте несколько групп:

sed 's/\\mErrRange{\([^}]*\)}{\([^}]*\)}{\([^}]*\)}/\1 ± \2 \3/g'

Можно объединиться как многие из тех выражений как Вам угодно, но это становится легко неясным. Я рекомендую писать a sed сценарий с одним выражением на строку как так:

#!/bin/sed -f
s/\\prc{\([^}]*\)}/\1 %/g
s/\\mErrRange{\([^}]*\)}{\([^}]*\)}{\([^}]*\)}/\1 ± \2 \3/g

Сохраните его как, например. script.sed, сделайте это исполняемым файлом с chmod +x /path/to/script.sed и выполненный это с /path/to/script.sed.

Пример выполняется

$ /path/to/script.sed <hello.txt
This is my \textbf{text} where there are about 5 % commands, i.e. 30 ± 20 m.

Я позволяю оболочке открывать входные файлы максимально часто, следовательно <hello.txt вместо просто hello.txt (который также работает!). Если Вам интересно, в каких взлетах это точно сделало, я рекомендую этот ответ на Unix. SE.

1
ответ дан 7 December 2019 в 15:24

Другие вопросы по тегам:

Похожие вопросы: