在bash中使用Regex组

Ale*_*yMK 1 regex unix linux command-line

问候,

我有一个目录,里面有pdf列表:

file1.pdf, file2.pdf, morestuff.pdf ... etc.

我想将这些pdf转换为png,即

file1.png, file2.png, morestuff.png ... etc.

基本命令是,

convert from to,

但我无法转换为重命名为相同的文件名.明显的"我希望它以这种方式工作"是

convert *.pdf *.png

但显然这不起作用.我的思维过程是我应该在这里使用正则表达式分组,想一想

convert (*).pdf %1.png

但这显然不是正确的语法.我想知道正确的语法是什么,以及是否有一个更好的方法(不需要跳转到perl或python),我忽略了.

谢谢!

gho*_*g74 5

for files in *.pdf 
do  
   if [ -f "$files" ];then
      convert "$files" "${files%.pdf}.png"
   fi
done
Run Code Online (Sandbox Code Playgroud)

如果你需要递归地做,

find /path -type f -iname "*.pdf" | while read -r FILE
do
   convert "$FILE" "${FILE%.pdf}.png"
done
Run Code Online (Sandbox Code Playgroud)


eph*_*ent 5

如果你真的想使用正则表达式,Bash≥3.1支持正则表达式.

for f in *.pdf; do
    [[ $f =~ ^(.*)\.pdf$ ]] &&
    convert "$f" "${BASH_REMATCH[1]}.png"
done
Run Code Online (Sandbox Code Playgroud)

并且所有系统都应该具有shell实用程序expr.

for f in *.pdf; do
    match=$(expr "$f" : '\(.*\)\.pdf$') &&
    convert "$f" "$match.png"
done
Run Code Online (Sandbox Code Playgroud)

但是Bash的参数扩展(如其他答案中所示)对于像这样的简单情况更有效.