使用 sed 将模式替换为哈希值

使用 sed 将模式替换为哈希值

我想搜索该文件并用其哈希 (SHA1) 值替换特定模式。

例如,letfile.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

答案1

$(…)在您的尝试中,执行命令替换 ( ) 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

答案2

@manatowork 肯定已经提供了答案。只是将其添加为好奇心......

bash+sha1sum 变体。

function fail()
{
    printf "Failed on line \`%s'\n" "$line" >&2
    exit 2
}

declare -A sha_map;
re='[A-Z][0-9]{2}[A-Z]';

while read -r line; do
    while [[ $line =~ $re ]]; do
        m="${BASH_REMATCH[0]}";
        if ! [[ ${sha_map[$m]} ]]; then
            sha="$(printf "%s" "$m" | sha1sum)" || fail;
            sha_map["$m"]=${sha%% *};
        fi
        line=${line//$m/${sha_map[$m]}};
    done
    printf "%s\n" "$line";
done <"$fn"

答案3

这是我的解决方案:

cp file.txt result.txt
cat file.txt | grep -o '[A-Z][0-9]\{2\}[A-Z]' | while read i ; do
    sed -i "s/$i/$(echo -n $i | sha1sum | cut -f 1 -d ' ')/g" result.txt
done

只需复制所有行并将其粘贴到终端中即可。和file.txt

one S56G one two three
four five V67X six

我明白了

one 03763566330069a397584344c0a640a3cba05a4c one two three
four five 7802350a2592cdc6dfdee408336919ee9e3cc5f2 six

该解决方案的复杂度为 O(n^2),不适合用于具有许多模式匹配的大文件,因为它会处理每个模式匹配的目标文件。

相关内容