【问题标题】:How to remove 4 characters before a file extension using shell如何使用shell删除文件扩展名前的4个字符
【发布时间】:2016-12-27 22:07:16
【问题描述】:

我有很多类似的网址。

<random_tex>/original/Widget-Examples-FAQ3dad.png?1437083013

<random_tex>/original/Optimizec9cd.png?1413334050

我想去掉.png之前的4个字符,输出应该是这样的

<random_tex>/original/Widget-Examples-FAQ.png?1437083013
<random_tex>/original/Optimize.png?1413334050

我尝试使用 sed 替换,但无法找到 .png 之前的确切 4 个字符的模式

sed我试过的是:sed 's/\(.{0,3}\.\)png/\1png/'

【问题讨论】:

    标签: bash shell replace sed character


    【解决方案1】:

    如果“文件”包含你所有的网址,每行一个...

    您只能使用 bash shell 参数扩展:

    cat file | while read -r line
    do 
      echo ${line/????.png/.png}
    done
    

    或者 gawk/awk 解决方案:

    gawk '{ sub(/.{4}.png/,".png",$0); print $0 }' file
    

    【讨论】:

    • 很好,但你错过了空行添加!/^$/ 或其他东西。
    • 鉴于各种输入文件内容,shell 脚本会非常缓慢并且失败 - 永远不要那样做。请参阅 why-is-using-a-shell-loop-to-process-text-considered-bad-practice 和 google UUOC,引用 shell 变量和通配符。 awk 命令要好得多,除非png 出现在输入的前面,否则它不会失败,但它可以简单地写成awk '{sub(/.{4}\.png/,".png")}1' file
    【解决方案2】:

    你可以这样做,POSIX-ly:

    sed 's/.\{4\}\(\.png\)/\1/'
    
    • .\{4\} 匹配 .png 之前的 4 个字符,在替换中刚刚使用 .png

    请注意,对于多个.png 模式,将修改第一个。

    示例:

    $ sed 's/.\{4\}\(\.png\)/\1/' <<<'/original/Widget-Examples-FAQ3dad.png?1437083013'
    /original/Widget-Examples-FAQ.png?1437083013
    
    $ sed 's/.\{4\}\(\.png\)/\1/' <<<'/original/Optimizec9cd.png?1413334050'
    /original/Optimize.png?1413334050
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-08-22
      • 1970-01-01
      • 1970-01-01
      • 2013-07-10
      • 1970-01-01
      • 2015-01-25
      • 2012-05-19
      相关资源
      最近更新 更多