首页 > 解决方案 > 参数替换替换为交替 (OR) |

问题描述

考虑到大小写,我正在尝试替换文件名的扩展名,但没有成功。

#!/bin/bash
pdf_file="/root/users/test.pdf"
jpg_file="${pdf_file/.pdf/.jpg}"
echo $jpg_file

我试过了,但它不起作用:

jpg_file="${pdf_file/(.pdf|.PDF)/.jpg}"

标签: linuxbash

解决方案


您可以使用这样的全局模式:

$ echo "${pdf_file/.[Pp][Dd][Ff]/.jpg}"
/root/users/test.jpg

如果您使用扩展的 glob 模式 ( shopt -s extglob),您可以使用它来代替:

$ echo "${pdf_file/.@(PDF|pdf)/.jpg}"
/root/users/test.jpg

或者您可以使用 shell 选项在匹配时忽略大小写:

$ shopt -s nocasematch
$ pdf_file="/root/users/test.PDF"
$ echo "${pdf_file/.pdf/.jpg}"
/root/users/test.jpg

备注对所有三种解决方案都有效:在任何出现的地方替换模式,但扩展可能在最后——我们可以确保只在最后替换它:${parameter/pattern/string}

echo "${pdf_file%.[Pp][Dd][Ff]}.jpg"

它适用于任何 POSIX shell,或

shopt -s extglob
echo "${pdf_file%.@(PDF|pdf)}.jpg"

或者

shopt -s nocasematch
pdf_file="/root/users/test.PDF"
echo "${pdf_file%.pdf}.jpg"

推荐阅读