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
.