Bashで複数の部分文字列を一度に置き換える方法は?

Bashで複数の部分文字列を一度に置き換える方法は?

Bashに反映したい画像ファイルを含むディレクトリがあります。エコー中にファイル名と拡張子を1行のコマンドに変更したいと思います。

サンプルファイル:

images/file_name_1.jpg
images/file_name_2.jpg

通常、次のように単一の交換を実行できます。

for i in images/*; do echo ${i/file/image}; done

出力は次のとおりです。

images/image_name_1.jpg
images/image_name_2.jpg

forループに保持し、 "jpg"文字列も "png"に置き換えるにはどうすればよいですか?これは単なる例であり、ドットをカンマなどに置き換えることができます。

私がこれをしようとすると:

for i in images/*; do echo ${{i/jpg/png}/file/image}; done

これはうまくいきません。他の解決策やアイデアが見つかりません。可能ですか?それではどうですか?

答え1

簡単な方法は、結果を変数に割り当ててからその変数を使用することです。例:

for filename in images/*
do
    echo "filename is now $filename"
    filename=${filename/jpg/png}; echo "filename is now $filename"
    filename=${filename/file/image}; echo "filename is now $filename"
    echo "final filename is ${filename}"
done

答え2

以前の置換を変数に割り当ててから、その変数に対して置換を実行できます。

for i in images/*
do
    j=${i/jpg/png}
    echo ${j/file/image}
done

答え3

変化ランダムな文字列:

$ echo "images/file_name_1.jpg" | perl -pE 's/file/image/;s/jpg$/png/;'
images/image_name_1.png

名前が変更されたショートカット(最終目標かもしれません:

$ rename 's/file/image/;s/jpg$/png/;' "$i"

関連情報