代码之家  ›  专栏  ›  技术社区  ›  geowa4

在bash中使用regex组

  •  1
  • geowa4  · 技术社区  · 14 年前

    问候语,

    我有一个包含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中),我忽略了。

    谢谢!

    4 回复  |  直到 14 年前
        1
  •  5
  •   ghostdog74    14 年前
    for files in *.pdf 
    do  
       if [ -f "$files" ];then
          convert "$files" "${files%.pdf}.png"
       fi
    done
    

    如果你需要递归地做,

    find /path -type f -iname "*.pdf" | while read -r FILE
    do
       convert "$FILE" "${FILE%.pdf}.png"
    done
    
        2
  •  5
  •   ephemient    14 年前

    如果你 真正地 想使用regex,bash≥3.1支持正则表达式。

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

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

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

    但是巴什的 parameter expansion (如其他答案所示)对于类似这样的简单案例效果更好。

        3
  •  4
  •   Ignacio Vazquez-Abrams    14 年前
    for f in *.pdf
    do
      convert "$f" "${f%.pdf}.png"
    done
    
        4
  •  1
  •   ghostdog74    14 年前
    ls *.pdf | sed 's/\"/\\"/;s/^\(.*\).pdf$/convert "&" "\1.png"/' | bash