捕获组内的sed替换

时间:2014-04-12 17:27:24

标签: regex bash sed

我认为我遗漏了一些显而易见的东西,但我花了很多时间用谷歌搜索堆栈溢出,我找不到答案。我正在寻找一种方法来对捕获的组执行额外的sed替换。所以,例如,如果我有文字:

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

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

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

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

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

输出:

./x y.jpg 93845ad8b6fb2797d9f1d7e0622e9270

思想?

2 个答案:

答案 0 :(得分:2)

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

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

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

  • 第一个s命令:我使用|临时区分了两个反向引用。
  • 2nd s:然后我用_字符替换所有空格。
  • 3rd s:我用空格替换|,以便留下一个空格。

当然,只有输入数据不包含|字符时,此技巧才有效。

答案 1 :(得分:1)

您可以使用此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