如何在 bash 中一次替换多个子字符串?

如何在 bash 中一次替换多个子字符串?

我有一个目录包含要在 bash 中回显的图像文件。在回显时,我想在单行命令中替换文件名和扩展名。

示例文件:

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"

相关内容