特定の行の特定の部分をsedにして置き換える方法は?

特定の行の特定の部分をsedにして置き換える方法は?

次の行を含むファイルがありますLaTeXfoo.tex

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

ファイル拡張子を追加するために、ファイル内の次の行を置き換えたいと思います。

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

私は次のコマンドを試して始めましたsed

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

しかし、次のように返されます。

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

sedファイル拡張子を追加するコマンドを変更する方法は?

編集する

イメージファイル名はimg1、img2などではありません。

答え1

$ 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}}

一致の最後にimg追加されるランダムな数字(ゼロの数字を含む)が続く代替操作の正規表現検索。.png

交換のみを行う少し強力なバージョン~へ大きな括弧:

$ sed '/\\includegraphics/s/{\(img[0-9]*\)}/{\1.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}}

{img3}このコマンドは、(たとえば)を含む行を見つけて\includegraphics抽出し、img3追加し.png、新しい中かっこで再度ラップすることを望みます{img3.png}

関連情報