[resolvido] comando sed

Iniciado por sigur, 30 de Maio de 2012, 16:37

tópico anterior - próximo tópico

irtigor

#30
Expansão de chaves

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.

sigur

#31
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 \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  \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 tipogrep 'bla' foo | sed 's/bla/mmm/'  [b]E[/b] echo '$file' > file.tex

Qual a diferença entre echo ' ' e echo " " ?

irtigor

http://wiki.bash-hackers.org/syntax/quoting#quotes_and_escaping

Com sed

sed -i '/baz/s/foo/bar/' file.txt


Substitui foo por bar, somente nas linhas com baz.

sigur

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:
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
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:
./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.

irtigor

#34
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


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

sigur

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
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.