【问题标题】:ImageMagick - annotation in a for loop with regex?ImageMagick - 带有正则表达式的for循环中的注释?
【发布时间】:2016-06-20 23:07:30
【问题描述】:

我无法让正则表达式在 for 循环中使用正则表达式作为注释的 imagemagick。

这只是我想写的一个例子:

$ for i in *.jpg; do convert "$i" -fill white -undercolor '#00000060' -gravity South -pointsize 30 -annotate +0+50 "${i:(\.{2}(.*)\.\w*$'\)}" "./caption/${i%.jpg}-title.jpg" ; done;

错的部分是:

"${i:(\.{2}(.*)\.\w*$'\)}"

注意:正则表达式做我喜欢做的事。从开头和后缀中删除 2 个字符。

【问题讨论】:

    标签: regex for-loop imagemagick


    【解决方案1】:

    为什么要使用正则表达式。如果您只尝试删除第一个和最后 2 个字符,则子字符串可能更容易

    for i in *.jpg
    do
        convert "$i" \
            -fill white \
            -undercolor '#00000060' \
            -gravity South \
            -pointsize 30 \
            -annotate +0+50 "${i:1:${#i}-3}" \
            "./caption/${i%.jpg}-title.jpg"
    done
    

    从 cmets 编辑

    如果您绝对使用 RegEx,我建议您使用 ,或其他提供扩展 RegEx 支持的实用程序。

    for i in *.jpg
    do
        TEXT=$(echo $i | sed -e 's/^..\(.*\)..$/\1/')
        convert "$i" \
            -fill white \
            -undercolor '#00000060' \
            -gravity South \
            -pointsize 30 \
            -annotate +0+50 "$TEXT" \
            "./caption/${i%.jpg}-title.jpg"
    done
    

    【讨论】:

    • 我对 bash 中的字符串操作很陌生。这对我来说仍然很困惑。但我对 RegEx 非常熟悉,您删除了您的 regex 解决方案。一个有效的正则表达式解决方案会很棒,因为它对未来的需求非常灵活。 "${i:1:${#i}-3}" 有效,但为什么 "${i:1:-3}" 和 "${i:1:(-3)}" 无效?
    • 正如你所知,正则表达式可以很好地处理不同长度的字符串,也可以处理不规则的字符串。
    • 答案已更新以包含正则表达式。我最初删除了正则表达式,因为我觉得它反对YAGNI principle
    • 再次感谢@emcconville! sed 版本适用于正则表达式。但是 sed 有一些奇怪的正则表达式实现。与 posix 不同的语法,什么不是。我在最初的描述中有点不清楚。我从一开始就输入 2 个字符和整个后缀(任何长度),包括分隔符。现在看起来像: TEXT=$(echo $i | sed -e 's/^.\{2\}(.*)\.[a-zA-Z0-9]*$/\1/')
    猜你喜欢
    • 2012-01-27
    • 2014-12-17
    • 1970-01-01
    • 2013-03-12
    • 2021-05-15
    • 2014-07-26
    • 1970-01-01
    • 2014-08-17
    • 1970-01-01
    相关资源
    最近更新 更多