Удалить конкретную латексную команду из текста И закрывающую скобку за ней

Попробуйте этот:

for i in `awk '{print $1}' A.csv`;
 do
         t1=`awk -v a="$i" '$1==a {print $3}' A.csv`;
         awk -F' ' -v a="$i" -v b="$t1" '$1==a {print $1" "$2" "$3" " b }' B.csv;
 done
1
28.06.2017, 01:13
1 ответ

Вот тот, который работает в простом случае только одного уровня команд внутри \edit{...}, максимум:

perl -00 -lpe 's,\\edit\{( (?: [^}\\]* | \\[a-z]+\{[^}]*\} )+ )\},$1,xg'

Средняя часть (?: [^ }\\]* | \\[az]+\{[^}]*\} )+имеет альтернативы: [^}\\]*соответствует любой строке без закрывающей фигурной скобки или обратной косой черты (обычный текст); и \\[az]+\{[^}]*\}соответствует чему-либо с обратной косой чертой, строчными буквами, а затем совпадающей парой фигурных скобок (например, \url{независимо...} ). Группировка (?:...)+повторяет эти альтернативы и захват внешней скобки, поэтому мы можем заменить совпадение только частью внутри \edit{...}.

-00указывает Perl обрабатывать ввод по одному абзацу за раз, разделяя абзацы пустыми строками. Если вам нужно обрабатывать теги, охватывающие абзацы, измените это значение на -0, чтобы обработать весь ввод за один раз.

В вашем примере это, кажется, работает, давая:

We Introduce a model for analyzing \emph{data} from various
experimental designs, such as paired or \url{http://www/}
longitudinal; as was done 1984 by NN \cite{mycitation} and by NNN
\cite{mycitation2}.

Однако он (как и ожидалось) терпит неудачу для ввода с двумя уровнями команд внутри \edit{...}:

Some \edit{\somecmd{\emph{nested} commands} here}.

Превращается в:

Some \somecmd{\emph{nested} commands here}.

(неправильная закрывающая скобка удалена)


На самом деле обработка сбалансированных скобок несколько сложнее, это обсуждается, например в этом вопросе на SO: Регулярное выражение Perl: соответствие вложенным скобкам.

3
27.01.2020, 23:33

Теги

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