使用 sed 用哈希值替换模式

use*_*905 5 sed shell-script text-processing hashsum

我想搜索文件并用它的散列 (SHA1) 值替换特定模式。

例如,let file.txt有以下内容:

one S56G one two three
four five V67X six

我想[A-Z][0-9]\{2\}[A-Z]用匹配的 SHA1 值替换模式。在上面的示例中,匹配项是S56GV67X

使用sed,我试过:

sed "s/[A-Z][0-9]\{2\}[A-Z]/$(echo \& | sha1sum)/g"

没有成功,因为结果始终是 的哈希值'&'

我还尝试ge使用以下命令进行标记:

sed 's/[A-Z][0-9]\{2\}[A-Z]/echo & | sha1sum/ge'

抛出错误:

sh: 1: one: not found
sha1sum: one: No such file or directory
sha1sum: two: No such file or directory
sha1sum: three: No such file or directory

man*_*ork 8

在您的尝试中,命令替换 ( $(…)) 在执行之前 sed执行,并将字符串作为参数传递给它。

使用正则表达式替换支持代码执行的脚本语言:

perl -MDigest::SHA=sha1_hex -pe 's/[A-Z][0-9]{2}[A-Z]/sha1_hex$&/ge' inputfile

php -R 'echo preg_replace("/[A-Z][0-9]{2}[A-Z]/e","sha1(\$0)",$argn),"\n";' inputfile

ruby -rdigest/sha1 -pe '$_.gsub!(/[A-Z][0-9]{2}[A-Z]/){Digest::SHA1.hexdigest$&}' inputfile

python -c 'import sys,fileinput,re,hashlib;[sys.stdout.write(re.sub("[A-Z][0-9]{2}[A-Z]",lambda s:hashlib.sha1(s.group(0)).hexdigest(),l))for l in fileinput.input()]' inputfile
Run Code Online (Sandbox Code Playgroud)