【问题标题】:Using Regex groups in bash在 bash 中使用正则表达式组
【发布时间】:2011-01-26 15:14:59
【问题描述】:

你好,

我有一个包含 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)。

谢谢!

【问题讨论】:

    标签: regex linux unix command-line


    【解决方案1】:
    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】:

    如果你真的想使用正则表达式,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
    

    但是 Bash 的 parameter expansion(如其他答案所示)更适合像这样的简单案例。

    【讨论】:

      【解决方案3】:
      for f in *.pdf
      do
        convert "$f" "${f%.pdf}.png"
      done
      

      【讨论】:

      【解决方案4】:
      ls *.pdf | sed 's/\"/\\"/;s/^\(.*\).pdf$/convert "&" "\1.png"/' | bash
      

      【讨论】:

      • 如果文件名包含反斜杠或引号怎么办?
      • 你试过这个命令吗?它适用于反斜杠或引号。
      • touch \".pdf 或见鬼,邪恶,touch '$(rm -rf /).pdf'
      • 您将无法创建touch '$(rm -rf /).pdf',因为/ 的文件名是非法的。至于引号,是转义的问题。
      • 让它内联工作的方法。文件名(在这种情况下)不包含任何可能令人担忧的字符。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-10
      • 2014-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-14
      相关资源
      最近更新 更多