![如何在 bash 中一次替换多个子字符串?](https://linux22.com/image/53193/%E5%A6%82%E4%BD%95%E5%9C%A8%20bash%20%E4%B8%AD%E4%B8%80%E6%AC%A1%E6%9B%BF%E6%8D%A2%E5%A4%9A%E4%B8%AA%E5%AD%90%E5%AD%97%E7%AC%A6%E4%B8%B2%EF%BC%9F.png)
我有一个目录包含要在 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"