Replace all characters except the first four characters
With GNU Sed,
md5sum input.txt | sed 's/./x/5g'
This simply skips substituting the 4 first characters of the string and performs the substitution for all other characters.
A POSIX alternative with Awk (although there is probably something simpler),
md5sum xad | awk '{
four=substr($0, 1, 4)
rest=substr($0, 5)
gsub(/./, "x", rest)
print four, rest
}' OFS=""
POSIXly (I think), you could use a sed loop to repeatedly replace the first non-x
character following the 4-character prefix:
$ md5sum input.txt | sed '
:a
s/^\(....x*\)[^x]/\1x/
ta
'
Replace [^x]
with [^x ]
if you only want to do the substitution in the first field (the checksum).
With perl
if GNU sed
isn't available:
md5sum input.txt | perl -pe 's/^.{4}(*SKIP)(*F)|./x/g'
^.{4}(*SKIP)(*F)
will prevent replacement of first four characters
|.
specifies the alternate pattern that has to be replaced
To change only the checksum:
md5sum ip.txt | perl -pe 's/(^.{4}|\h.*$)(*SKIP)(*F)|./x/g'
If the md5sum
output starts with a \
(for ex: if filename has a newline character), then you can use ^\\?.{4}
instead of ^.{4}
to allow first five characters to be left unmasked.