我想从如下字符串中提取sed的哈希值:
[129.173.213.225:52196] some_text: another_text --> eb1d94daa7e0344597e756a1fb6e7054
期望的结果是只有32字节的散列值eb1d94daa7e0344597e756a1fb6e7054。
所以我用regexp尝试了下面的命令(想法是除去除匹配的模式之外的所有模式):

% sed 's/\([0-9a-f]{32}\)$/\1/g' < file

从而导致错误:
sed: -e expression #1, char 20: invalid reference \1 on `s' command's RHS

-r传递给sed没有帮助,我也遇到了同样的错误。
我认为regexp本身是正确的,因为sed -r 's/[0-9a-f]{32}$/XXX/g'确实用xxx字符串替换了32字节的散列值。但我想删除除散列值以外的所有字符串。
% cat /etc/issue
Ubuntu 16.04.6 LTS \n \l

%
% ls -la `which sed`
-rwxr-xr-x 1 root root 73424 Feb 11  2016 /bin/sed
%

我做错什么了?

最佳答案

您可以尝试用空字符串替换行中-->部分的所有内容:
也就是说,替换符合.* -->的内容。
所以命令是:

sed 's/.* -->//g' < file

即使some_text包含箭头符号,我们也在使用greedy正则表达式,它将尽可能长地匹配。
示例行的结果如下:
«~» $ sed 's/.* -->//g' < testregex
 eb1d94daa7e0344597e756a1fb6e7054

关于regex - 将32字节的哈希值与sed匹配,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/58416226/

10-16 20:27