【问题标题】:How to extract last 2 characters before the extension of a filename in bash?如何在bash中提取文件名扩展之前的最后2个字符?
【发布时间】:2013-09-17 05:26:25
【问题描述】:

我想要完成的是取一个文件名,比如说myfileRE.txt,然后返回新的文件名myfile.txt。额外的两个字符将始终是两个字符,所以我尝试做的是:

${filename%??.}

我的想法是“匹配句号之前的 2 个字符并将这些字符撕掉”..不幸的是,它只返回了整个文件名。

我最终这样做了:

${filename%??????}.txt

但这不是很友好,必须有一种更清洁的方法来做到这一点。有什么建议吗?也许有正则表达式的东西?

【问题讨论】:

    标签: regex bash ksh


    【解决方案1】:

    为了从字符串中间拉出一些东西,你可以使用替换。以下在 bash 中有效:

    filename=myfileRE.txt
    echo "${filename/??./.}"
    

    这是匹配模式“??.”并将其替换为“。”。它类似于 perlsed 替换,除了它使用 shell 模式匹配而不是正则表达式。

    【讨论】:

    • 这很完美,但它到底在做什么?在我看来,它不像字符串运算符。
    • 好吧,很酷,我认为它看起来与sed 非常相似。感谢您的帮助!
    【解决方案2】:

    Jordanm 的方法可能是可行的方法,但只是为了多样化

    echo "${filename%%??.*}.${filename#*.}"
    

    【讨论】:

    • 您的方法确实具有 POSIX 的优点,而我的方法则没有。
    • jordanm 的方法比较好。它不适用于 myfileRE.tar.gz 之类的文件名。
    • @konsolebox,最新版本处理myfileRE.tar.gz的情况,但是是的,jordan的解决方案更好
    猜你喜欢
    • 2013-07-10
    • 2013-06-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多