grep e sed em específico

1

Eu estou lutando para encontrar uma maneira de substituir todas as linhas com as seguintes informações em arquivos * .tex, por exemplo:

text{fig/titel/Logo}text

para

text{fig/titel/Logo.png}text

Eu tentei:

egrep --include=*.tex -r ".*{fig/.*" *

e me dá as linhas onde quero fazer as alterações. Mas como eu continuo com o comando sed por exemplo?

Eu usei find e sed, mas nunca usei grep e sed. Alguém pode ajudar por favor?

    
por infoclogged 19.08.2016 / 16:47

2 respostas

1

Assumindo as ferramentas GNU (que você parece estar usando):

grep -r --include='*.tex' -lZ '{fig/.*}' . |
  xargs -r0 sed -i.back 's:\({fig/[^}]*\)}:.png}:g'

grep para encontrar a lista de arquivos a serem atualizados, sed para fazer a atualização apenas para esses arquivos.

Ou se você quiser adicionar apenas o .png , se ele não estiver lá, o grep do GNU terá uma opção -P para o regEXp do PCRE com seu operador de look-behind (?<!...) negativo, mas não o GNU sed ainda (embora ssed na mesma família tenha), então mude para perl aqui:

grep -Pr --include='*.tex' -lZ '\{fig/[^}]*(?<!\.png)\}' . |
  xargs -r0 perl -pi.back -e 's:(\{fig/[^}]*(?<!\.png))\}:$1.png}:g'

Com -i.back , o arquivo original é salvo com a extensão .back .

    
por 19.08.2016 / 17:07
1

Ao usar sed você não precisa de grep , porque sed pode fazer pesquisas de padrões ao mesmo tempo.

Nesse caso, é uma expressão bem simples; procure a string {fig/ e, em seguida, anexe um png

Agora, a expressão de pesquisa precisa ser um pouco mais inteligente, já que queremos parar no caractere de fechamento } , mas isso é muito normal. Devemos também levar em conta que pode haver mais de um por linha.

Então acabamos com

sed 's!{\(fig/[^}]*\)}!{.png}!g' 

Por exemplo:

$ cat x
untouched lines
text{fig/titel/Logo}text
more lines
text{fig/somethingelse/image}text
text{fig/stuff}text and {fig/morestuff}text

$ sed 's!{\(fig/[^}]*\)}!{.png}!g' x
untouched lines
text{fig/titel/Logo.png}text
more lines
text{fig/somethingelse/image.png}text
text{fig/stuff.png}text and {fig/morestuff.png}text

Podemos ver que as entradas {fig/...} agora têm png acrescentadas e outras coisas estão intactas.

    
por 19.08.2016 / 16:56

Tags