Попробуйте этот:
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
Вот тот, который работает в простом случае только одного уровня команд внутри \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: соответствие вложенным скобкам.