Insira algumas linhas antes de uma linha específica com sed

4

tenho o seguinte arquivo

<?xml version="1.0"?>
<!DOCTYPE fontconfig SYSTEM "fonts.dtd">
<fontconfig>
  <dir>/usr/local/texlive/2017/texmf-dist/fonts/opentype</dir>
  <dir>/usr/local/texlive/2017/texmf-dist/fonts/truetype</dir>
  <dir>/usr/local/texlive/2017/texmf-dist/fonts/type1</dir>
</fontconfig>

e eu tenho que adicionar as seguintes linhas:

  <dir>/usr/local/texlive/texmf-local</dir>
  <dir>/usr/local/share/fonts</dir>

antes da tag de fechamento / fontconfig & gt ;. Não tenho certeza de que está sempre na 7ª linha, então devo procurá-lo como uma string. Tenho alguns problemas nessas sequências com < > e / ... Como posso resolver com sed? thanx

    
por user41063 25.02.2018 / 19:07

2 respostas

7

Não use sed , awk e similares para analisar dados XML / HMTL - nunca chegará a um resultado robusto e escalonável. Use um processador XML / HTML adequado.
O caminho certo com a ferramenta xmlstarlet :

xmlstarlet ed -s '//fontconfig' -t elem -n 'dir' -v '/usr/local/texlive/texmf-local' \
-s '//fontconfig' -t elem -n 'dir' -v '/usr/local/share/fonts' input.xml

A saída:

<?xml version="1.0"?>
<!DOCTYPE fontconfig SYSTEM "fonts.dtd">
<fontconfig>
  <dir>/usr/local/texlive/2017/texmf-dist/fonts/opentype</dir>
  <dir>/usr/local/texlive/2017/texmf-dist/fonts/truetype</dir>
  <dir>/usr/local/texlive/2017/texmf-dist/fonts/type1</dir>
  <dir>/usr/local/texlive/texmf-local</dir>
  <dir>/usr/local/share/fonts</dir>
</fontconfig>

Para modificar / editar o arquivo no local - adicione -L option: xmlstarlet ed -L ....

Para mais detalhes, digite: xmlstarlet ed --help

    
por 25.02.2018 / 19:19
1

Você pode superar os problemas de / no texto do padrão usando um delimitador diferente, como # , por exemplo,

sed '\#^</fontconfig>#i\
  <dir>/usr/local/texlive/texmf-local</dir>\
  <dir>/usr/local/share/fonts</dir>
' file
<?xml version="1.0"?>
<!DOCTYPE fontconfig SYSTEM "fonts.dtd">
<fontconfig>
  <dir>/usr/local/texlive/2017/texmf-dist/fonts/opentype</dir>
  <dir>/usr/local/texlive/2017/texmf-dist/fonts/truetype</dir>
  <dir>/usr/local/texlive/2017/texmf-dist/fonts/type1</dir>
  <dir>/usr/local/texlive/texmf-local</dir>
  <dir>/usr/local/share/fonts</dir>
</fontconfig>
    
por 25.02.2018 / 19:16

Tags