Como encontrar e substituir parte específica de linhas específicas por sed?

1

Eu tenho um LaTeX file foo.tex que contém estas linhas:

\includegraphics[width=0.49\textwidth]{img1}
\includegraphics{img2}
\subfloat{\includegraphics[width=0.3\textwidth]{img3}}
\subfloat{\includegraphics{img4}}

Eu gostaria de substituir essas linhas no arquivo para adicionar a extensão do arquivo, como:

\includegraphics[width=0.49\textwidth]{img1.png}
\includegraphics{img2.png}
\subfloat{\includegraphics[width=0.3\textwidth]{img3.png}}
\subfloat{\includegraphics{img4.png}}

Eu comecei a tentar com sed neste comando:

cat foo.tex | sed 's/\(includegraphics.*[a-z,0-9,\-]}\)/.png}/g' > bar.tex

Mas isso retorna:

\includegraphics[width=0.49\textwidth]{img1}.png
\includegraphics{img2}.png
\subfloat{\includegraphics[width=0.3\textwidth]{img3}.png}
\subfloat{\includegraphics{img4}.png}

Como eu poderia corrigir o meu comando sed para adicionar as extensões de arquivo?

Editar

Os nomes dos arquivos de imagem não são apenas img1, img2, etc.

    
por msampaio 22.03.2018 / 23:47

1 resposta

3
$ sed '/\includegraphics/s/img[0-9]*/&.png/g' input
\includegraphics[width=0.49\textwidth]{img1.png}
\includegraphics{img2.png}
\subfloat{\includegraphics[width=0.3\textwidth]{img3.png}}
\subfloat{\includegraphics{img4.png}}

A expressão regular para a operação de substituição procura img seguido por qualquer número de dígitos (incluindo zero dígitos) e acrescenta .png ao final da correspondência.

Uma versão um pouco mais robusta, que só executará as chaves de substituição dentro :

$ sed '/\includegraphics/s/{\(img[0-9]*\)}/{.png}/g' input
\includegraphics[width=0.49\textwidth]{img1.png}
\includegraphics{img2.png}
\subfloat{\includegraphics[width=0.3\textwidth]{img3.png}}
\subfloat{\includegraphics{img4.png}}

Isso procura (por exemplo) {img3} em qualquer linha contendo \includegraphics , extrai img3 dele, acrescenta .png e recapitula que em novas chaves, para o {img3.png} desejado.

    
por 23.03.2018 / 00:03

Tags