web-dev-qa-db-ja.com

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

動作しません。他の解決策やアイデアは見つかりません。これは可能ですか?もしそうなら、どのように?

4
kubilay

簡単なアプローチは、結果を変数に割り当ててから、その変数を操作することです。例:

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
3
a CVn

以前の置換を変数に割り当て、代わりにその変数で置換を実行できます

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

変更するには任意の文字列

$ 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"
0
user61786