Um problema típico do látex:
\SomeStyle{\otherstyle{this is the \textit{nested part} some more text...}}
Agora eu quero remover tudo \SomeStyle{...}
, mas não o conteúdo. O conteúdo contém chaves aninhadas. A linha acima deve se tornar:
\otherstyle{this is the \textit{nested part} some more text...}
Questões:
- Algum editor de LaTeX oferece uma maneira de fazer isso?
- Qual editor/script faz isso?
- Como fazer isso com sed? [🤓]
Minha solução é um script bash usando sed.
- preparar texto: marcar substituir string com ascii bell, adicionar nova linha após cada chave
- loop: find { -> adiciona X ao espaço de espera, find } -> remove X do espaço de espera, mantém o espaço vazio -> remove o fechamento }
- restaurar novas linhas e sino ascii para o anterior
O script funciona, mas falha com:
\badstyle{w}\badstyle{o}\badstyle{r}\badstyle{d}
Ele se tornará:
wo}rd}
a ramificação para :f parece não funcionar.
F=$(sed 's|\\|\\\\|g;s|{|\\{|g' <<< "$1" )
# mark all removestrings with ascii bell and newline
# add newline after each { and }
SEDpre='
s|'"$F"'|\a%\n|g
s|\{|\{\n|g
s|\}|\}\n|g
'
SEDpost='
:a;N;$!ba;
s|\a%\n||g
s|\{\n|\{|g
s|\}\n|\}|g
'
# count the brackets
SED='
/\a%/{
:a
n
:f
/\{/{x;s|$|X|;x;ba}
/\}/{x;
s|X||;
/^$/{x;bb}
x
ba
}
}
b
:b
/\}/{
s|\}||;
N;
s|\n||;
/\a%/bf
}
'
sed -r -E "$SEDpre" "$2" | sed -rE "$SED" | sed -rE "$SEDpost"