ファイルを検索して、特定のパターンをそのハッシュ(SHA1)値に置き換えたい。
たとえば、_file.txt
_に次の内容があるとします。
_one S56G one two three
_
four five V67X six
パターン_[A-Z][0-9]\{2\}[A-Z]
_を一致のSHA1値に置き換えたいと思います。上記の例では、一致するのは_S56G
_と_V67X
_です。
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
あなたの試みでは、コマンド置換($(…)
)が実行されますbeforesed
が実行され、文字列がパラメータとして渡されます。
正規表現置換がコード実行をサポートするスクリプト言語を使用します。
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
@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"