【问题标题】:bash sed regexp replace not finding resultsbash sed 正则表达式替换未找到结果
【发布时间】:2014-12-23 07:38:12
【问题描述】:

我有一个文件,其中的行如下所示:

mv -v DF-02239.jpg DF-02239.jpg
mv -v DF-02240.jpg DF-02240.jpg
mv -v DF-02241.jpg DF-02241.jpg
mv -v DF-02242.jpg DF-02242.jpg

我正在尝试用 .JPG 替换 FIRST .jpg 并使用以下 sed:

sed 's/\(mv -v .*?\)\(\.jpg\)\(.*\)/\1.JPG \3/' finalDuplicates.txt > finalCaseDuplicates.txt

我在这里验证了正则表达式的工作原理: http://regex101.com/r/cU9xV2/1

【问题讨论】:

  • 您是否有理由不想简单地使用sed 's/jpg /JPG /'?第一个 JPG 有一个跟随空间,第二个没有,所以你可以利用它
  • 说真的?!好的。让我试试。这样就简单多了。如果这不起作用......你看到我的正则表达式有什么问题吗?我会通知你的……一会儿
  • @morgano 请作为答案发布,我会感谢你。
  • 您的模式中的一个错误是使用了在 sed 的默认模式(基本正则表达式引擎)中不存在的非贪婪量词。
  • 其实我加的时候不行>

标签: regex bash sed


【解决方案1】:

稍微修改一下语法:

sed 's/\(mv -v .*\.\)jpg\(.*jpg\)/\1JPG\2/'

诀窍是将第二个jpg 字符串加入方程,这样贪婪的sed 就不会匹配整行。

【讨论】:

    【解决方案2】:

    您可以考虑以下使用否定字符类的正则表达式。

    sed 's/^\(mv -v[^.]\+\.\)jpg/\1JPG/'
    

    Ideone Demo

    【讨论】:

      【解决方案3】:

      您只需将 jpg 替换为 JPG ,sed 仅替换第一个匹配项

      sed 's/jpg/JPG/' file_name 
      

      输出

      mv -v DF-02239.JPG DF-02239.jpg
      mv -v DF-02240.JPG DF-02240.jpg
      mv -v DF-02241.JPG DF-02241.jpg
      mv -v DF-02242.JPG DF-02242.jpg
      

      【讨论】:

        猜你喜欢
        • 2018-08-22
        • 1970-01-01
        • 2021-12-31
        • 2012-01-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-12-13
        相关资源
        最近更新 更多