Estou tentando reordenar a saída gerada da seguinte maneira; Dado um fragmento tex como segue, eu quero mover o /^Constant/ abaixo de /Dummies/ , com a linha antes e depois de /^Constant/ . Além disso, eu gostaria de um resultado estável, que não faça uma alteração se Constant já estiver abaixo da última Dummies row (ele é executado como parte de um script para corrigir meus resultados de pesquisa e, até agora, esse script é estável).
Esta é a entrada do fragmento tex:
[1em]
Application Grade& & & -0.0857\sym{***}& -0.00412\sym{***}\
& & & (0.0149) &(0.00107) \
[1em]
Constant & -3.701\sym{***}& -0.311\sym{***}& 0 & 0 \
& (1.130) & (0.0853) & (.) & (.) \
[1em]
Major Dummies & No & No & Yes & Yes \
[1em]
Semester Dummies & No & No & Yes & Yes \
\hline
Esta é a saída desejada, que permanece estável (retorna o mesmo) se fornecida como entrada:
[1em]
Application Grade& & & -0.0857\sym{***}& -0.00412\sym{***}\
& & & (0.0149) &(0.00107) \
[1em]
Major Dummies & No & No & Yes & Yes \
[1em]
Semester Dummies & No & No & Yes & Yes \
[1em]
Constant & -3.701\sym{***}& -0.311\sym{***}& 0 & 0 \
& (1.130) & (0.0853) & (.) & (.) \
\hline
O código a seguir fará isso, mas não é estável. Basicamente, ele corresponde a Constant , descarta e reinsere [1em] (o que é necessário fazer em uma chamada separada, pois i\ afeta a saída, não o espaço padrão) e cola abaixo do destino. Não é estável porque adicionará [1em] s falsos após Semester Dummies . Francamente, é um pouco feio (exigindo chamadas separadas para sed ).
sed -E -i'' -e'/^Constant/ {N;h;N;d;}; /^Semester Dummies/ {G;};' fragment.tex
sed -E -i'' -e '/^Semester Dummies/ {a\
\[1em\]
};' fragment.tex
Acredito que um one-liner fará isso, combinando o padrão de múltiplas linhas /^\[1em\]\nConstant.*/ (após uma chamada para N;N; ), colocando isso no buffer h old e colando-o ( G; ) após %código%. Mas depois de muitas horas, man pages, pesquisas na web e upgrade para /Semester Dummies/ para uma boa medida, não consigo fazer com que esse script funcione. Isso expressa a ideia básica, mas não é válida (s não pode condicionalmente gnused old como eu faço aqui):
sed -E -i'' -e'/\[1em\]/ {N;N;s/^\[1em\]\nConstant.*//h;}; /Semester Dummies/ {G;}' fragment.tex
Eu tentei muitas variações confiando em h com vários endereçamentos, mas ainda não entendi a ordem de execução para comandos com vários destinatários quando você está mexendo com o espaço de padrão (chamando N;P;D;h;G; ). N; e N funcionam bem, mas até onde eu sei, P é completamente inútil.
Sim, sei que é mais fácil com D e awk ; na verdade, eu estaria interessado em ver todas as três soluções para comparação - mas aqui estou perguntando especificamente como fazer isso em perl .