我认为我遗漏了一些显而易见的东西,但我花了很多时间用谷歌搜索堆栈溢出,我找不到答案。我正在寻找一种方法来对捕获的组执行额外的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
思想?
答案 0 :(得分:2)
sed
允许您按顺序执行多个替换(s/.../.../
),每个替换前一个结果:
echo 'MD5 (./x y.jpg) = 93845ad8b6fb2797d9f1d7e0622e9270' |
sed 's/MD5 (\(.*\)) = \(.*\)/\1|\2/; s/ /_/g; s/|/ /'
这里我使用了一个简单的技巧:
s
命令:我使用|
临时区分了两个反向引用。s
:然后我用_
字符替换所有空格。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