我想像这样向 sed 输入命令:
md5sum input.txt | sed 's/^\(....\).*/\1/;q'
这是通过仅输出校验和的前 4 个字符来实现的。但是,我想输出前 4 个字符,但也有一个 x 代替所有其他字符(编辑信息)。我现在很失落。
答案1
借助 GNU Sed,
md5sum input.txt | sed 's/./x/5g'
这只是跳过替换字符串的前 4 个字符并执行所有其他字符的替换。
Awk 的 POSIX 替代方案(尽管可能有更简单的东西),
md5sum xad | awk '{
four=substr($0, 1, 4)
rest=substr($0, 5)
gsub(/./, "x", rest)
print four, rest
}' OFS=""
答案2
POSIXly(我认为),您可以使用 sed 循环重复替换x
4 字符前缀后面的第一个非字符:
$ md5sum input.txt | sed '
:a
s/^\(....x*\)[^x]/\1x/
ta
'
如果您只想在第一个字段(校验和)中进行替换,请替换[^x]
为。[^x ]
答案3
如果perl
不可GNU sed
用:
md5sum input.txt | perl -pe 's/^.{4}(*SKIP)(*F)|./x/g'
^.{4}(*SKIP)(*F)
将阻止替换前四个字符
|.
指定必须替换的替代模式
仅更改校验和:
md5sum ip.txt | perl -pe 's/(^.{4}|\h.*$)(*SKIP)(*F)|./x/g'
如果md5sum
输出以 a 开头\
(例如:如果文件名有换行符),那么您可以使用^\\?.{4}
而不是^.{4}
允许前五个字符不被屏蔽。
答案4
Quasímodo 的答案的问题在于它也用x
's 替换了文件名。 OP 就此发布了后续问题。这是一个sed
停在空间上的解决方案:
md5sum
始终为哈希生成 32 个字符的输出。您可以先查找 32 个字符,然后查找空格,然后用 X 替换最后 28 个字符,而不是检测空格。
md5sum input.txt | sed 's/^\([a-zA-Z0-9]\{4\}\)[a-zA-Z0-9]\{28\} /\1xxxxxxxxxxxxxxxxxxxxxxxxxxxx /g'
35c9xxxxxxxxxxxxxxxxxxxxxxxxxxxx input.txt
分解声明:
's/^\([a-zA-Z0-9]\{4\}\)[a-zA-Z0-9]\{28\} /\1xxxxxxxxxxxxxxxxxxxxxxxxxxxx /g'
's/ A / B /g'
we're substituting patterns matching A with B globally
's/ [a-zA-Z0-9] [a-zA-Z0-9] / /g'
we're looking for two groups of alphanumeric characters
's/ [a-zA-Z0-9]\{4\} [a-zA-Z0-9]\{28\} / /g'
The first group has exactly four characters
The second group has exactly twenty-eight characters
's/ \([a-zA-Z0-9]\{4\}\)[a-zA-Z0-9]\{28\} / /g'
The first group is a "capture group" which we can reference later
's/ \([a-zA-Z0-9]\{4\}\)[a-zA-Z0-9]\{28\} /\1 /g'
We will print out the first group verbatim in the output
's/ \([a-zA-Z0-9]\{4\}\)[a-zA-Z0-9]\{28\} /\1xxxxxxxxxxxxxxxxxxxxxxxxxxxx /g'
We will print x's followed by a space for the next 28 characters
's/^\([a-zA-Z0-9]\{4\}\)[a-zA-Z0-9]\{28\} /\1xxxxxxxxxxxxxxxxxxxxxxxxxxxx /g'
The statement must appear at the start of a line and have a space at the end.