Autor Tópico: [resolvido] comando sed  (Lida 12144 vezes)

Offline irtigor

  • Equipe Ubuntu
  • Usuário Ubuntu
  • *****
  • Mensagens: 4.344
  • Delete, delete, delete!
    • Ver perfil
Re: comando sed
« Resposta #30 Online: 14 de Junho de 2012, 08:59 »
Expansão de chaves
Código: [Selecionar]
for i in indice-{comm,talk,poster}.tex; do
  # use o "$i"
done

Três voltas, i assume os valores: indice-comm.tex, indice-talk.tex e indice-poster.tex. Pra pegar só a diferença, vai ter que usar manipulação de string.

----
Não tem como a entrada ser igual a saída, o redirecionamento é criado antes, portanto a arquivo ficaria truncado.
« Última modificação: 14 de Junho de 2012, 09:41 por irtigor »

Offline sigur

  • Usuário Ubuntu
  • *
  • Mensagens: 1.176
    • Ver perfil
Re: comando sed
« Resposta #31 Online: 14 de Junho de 2012, 10:59 »
Opa. Está quase tudo certo. Percebi que tem algo errado com a paginação do pdf gerado no fim. Por algum motivo, o número de página inserido não corresponde ao número real.

Isso só ocorre se compilo com o script. Usando o pdflatex direto no terminal, tudo funciona. Pensei que fosse algum problema em deletar os aux, mas não sei. Já comentei e continua na mesma.

Fuçando nos arquivos indice-* criados, notei coisas estranhas. Por exemplo, depois de colocar as linhas do \import{} na frente das linhas do \author{}, um deles ficou com
Código: [Selecionar]
\bla{xxx}^M\import{zzzz} ou seja, aparece um ^M.

Também, alguns arquivos possuem dois comandos \author{} em linhas consecutivas. Daí, o \author subiu só em uma delas e o \import ficou, ao invés de ficar com  
Código: [Selecionar]
\author{xxx}\author{www}\import{zzzz}
Estranho! Acho que terei que editar a fonte para tirar essa duplicidade.



não tem como fazer uma busca com o grep e fazer a troca de um comando e logo na frente usar o echo para escrever o nome do arquivo e salvar tudo isso em um file com o uso do > ? Algo do tipo
Código: [Selecionar]
grep 'bla' foo | sed 's/bla/mmm/'  [b]E[/b] echo '$file' > file.tex

Qual a diferença entre echo ' ' e echo " " ?
« Última modificação: 14 de Junho de 2012, 11:49 por sigur »

Offline irtigor

  • Equipe Ubuntu
  • Usuário Ubuntu
  • *****
  • Mensagens: 4.344
  • Delete, delete, delete!
    • Ver perfil
Re: comando sed
« Resposta #32 Online: 14 de Junho de 2012, 14:19 »
http://wiki.bash-hackers.org/syntax/quoting#quotes_and_escaping

Com sed
Código: [Selecionar]
sed -i '/baz/s/foo/bar/' file.txt

Substitui foo por bar, somente nas linhas com baz.

Offline sigur

  • Usuário Ubuntu
  • *
  • Mensagens: 1.176
    • Ver perfil
Re: comando sed
« Resposta #33 Online: 14 de Junho de 2012, 14:25 »
Estou tentando guardar os comandos em duas variáveis, para usar o echo e já colocar uma na frente da outra. Mas se eu digitar tudo no terminal, como abaixo, deu certinho. Porém, usando o .sh não funciona, a saída fica com 3 linhas, mas vazias.

Tudo no terminal:
Código: [Selecionar]
for file in texfiles/comm1*.tex; do autor=$(grep -E '^.author' $file); arquivo=$(echo -e "\\import{$file}"); echo $autor$arquivo >> indice-comm.tex; done

Bloco do .sh
Código: [Selecionar]
echo "| criando arquivos novos de índice para importação..."
for file in texfiles/comm*.tex ; do
autor = $( grep -E '^.author' $file ) #| sed -e 's;\\author;\\bla;' ); #>> indice-comm.tex
arquivo = $( echo -e "\\import{$file}" ) #| sed -e 's;\.tex;;' ); #>> indice-comm.tex
echo $autor$arquivo >> indice-comm.tex
done

nesse dá erro:
Código: [Selecionar]
./criar-caderno.sh: linha 25: autor: comando não encontrado
./criar-caderno.sh: linha 26: arquivo: comando não encontrado
./criar-caderno.sh: linha 25: autor: comando não encontrado
./criar-caderno.sh: linha 26: arquivo: comando não encontrado
./criar-caderno.sh: linha 25: autor: comando não encontrado
./criar-caderno.sh: linha 26: arquivo: comando não encontrado

Não entendo o uso de ponto-vírgula.

Obrigado.

Offline irtigor

  • Equipe Ubuntu
  • Usuário Ubuntu
  • *****
  • Mensagens: 4.344
  • Delete, delete, delete!
    • Ver perfil
Re: comando sed
« Resposta #34 Online: 14 de Junho de 2012, 14:54 »
Código: [Selecionar]
for file in texfiles/comm*.tex ; do
  autor="$(grep -E '^\\author' "$file")"
  echo "$autor\\import{$file}" >> indice-comm.tex
done
Usar um subshell pra um echo não é uma boa ideia.

-----
Uma alteração, no exemplo anterior não usei o -r do read, assim é melhor

Código: [Selecionar]
i=0
while read -r linha; do
   (( $i%2 == 0 )) && echo -n "$linha" || echo "$linha"
   let i=$i+1
done < indice-comm.tex > temp.tex
sort temp.tex > indice-comm.tex
« Última modificação: 14 de Junho de 2012, 18:58 por irtigor »

Offline sigur

  • Usuário Ubuntu
  • *
  • Mensagens: 1.176
    • Ver perfil
Re: comando sed
« Resposta #35 Online: 14 de Junho de 2012, 19:37 »
Prezado colega. Muito obrigado pela ajuda e desculpe por fazê-lo trabalhar demais. Conforme fui estudando, percebi que podia fazer mais simples, ou seja, já pude escrever no arquivo uma linha na frente da outra, ou melhor, os dois comandos na mesma linha. Daí, não precisei da gambiarra pra juntar duas linhas.

Pois bem, agora acho que está tudo redondo, consertei o problema da paginação. Só não sei porque motivo algumas linhas do \import não juntaram. Mas tudo bem, pro TeX não tem problema, o importante é usar o sort.

Veja como ficou o bloco
Código: [Selecionar]
echo "| criando arquivos novos de índice para importação..."
for file in texfiles/comm*.tex ; do
  autor="$(grep -E '^\\author' "$file" | sed -e 's;\\author;\\bla;' )"
  echo "$autor\\import{$file}" >> temp.tex
  sed -e 's;\.tex;;' -i temp.tex
done
sort temp.tex > indice-comm.tex
rm temp.tex 2> /dev/null
echo "| arquivo indice-comm.tex criado"

Troquei o \author por \bla pois não posso ter mais de um no mesmo arquivo tex. Daí, defini o \bla como vazio e pronto.

Obrigado mesmo pela ajuda hein.
Valeu.