【问题标题】:sed substitutions within captured group捕获组内的 sed 替换
【发布时间】:2014-04-12 17:27:24
【问题描述】:

我认为我遗漏了一些明显的东西,但我花了很多时间谷歌搜索和搜索 stackoverflow,但我找不到答案。我正在寻找一种方法来对捕获的组执行额外的 sed 替换。因此,例如,如果我有文本:

MD5 (./x y.jpg) = 93845ad8b6fb2797d9f1d7e0622e9270
MD5 (./x y z.jpg) = 93845ad8b6fb2797d9f1d7e0622e9270

我想用下划线替换括号内的空格并将字符串重新格式化为文件名md5。

./x_y.jpg 93845ad8b6fb2797d9f1d7e0622e9270
./x_y_z.jpg 93845ad8b6fb2797d9f1d7e0622e9270

我能够捕获文件名,但我不知道如何对捕获的组执行另一个替换。

echo 'MD5 (./x y.jpg) = 93845ad8b6fb2797d9f1d7e0622e9270' | sed 's/MD5 (\(.*\)) = \(.*\)/\1 \2/'

输出:

./x y.jpg 93845ad8b6fb2797d9f1d7e0622e9270

想法?

【问题讨论】:

    标签: regex bash sed


    【解决方案1】:

    sed 允许您按顺序执行多个替换 (s/.../.../),每个替换都对前一个的结果进行操作:

    echo 'MD5 (./x y.jpg) = 93845ad8b6fb2797d9f1d7e0622e9270' |
     sed 's/MD5 (\(.*\)) = \(.*\)/\1|\2/; s/ /_/g; s/|/ /'
    

    这里我使用了一个简单的技巧:

    • 第一个s 命令:我使用| 临时分隔两个反向引用。
    • 第二个s:然后我用_ 字符替换所有空格。
    • 第三个s:我用空格替换|,这样就剩下一个空格了。

    当然,这个技巧只有在您的输入数据不包含 | 字符时才有效。

    【讨论】:

      【解决方案2】:

      你可以用这个sed

      sed 's/ /_/g; s/MD5_(\(.*\))_=_\(.*\)/\1 \2/'
      

      测试:

      sat:~$ echo 'MD5 (./x y z.jpg) = 93845ad8b6fb2797d9f1d7e0622e9270' | 
       sed 's/ /_/g; s/MD5_(\(.*\))_=_\(.*\)/\1 \2/'
      ./x_y_z.jpg 93845ad8b6fb2797d9f1d7e0622e9270
      

      【讨论】:

        猜你喜欢
        • 2018-07-23
        • 1970-01-01
        • 2017-05-02
        • 2019-10-16
        • 2018-04-27
        • 2017-12-05
        • 2018-12-28
        • 2020-09-14
        • 2020-12-04
        相关资源
        最近更新 更多