替换除前四个字符之外的所有字符

替换除前四个字符之外的所有字符

我想像这样向 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 循环重复替换x4 字符前缀后面的第一个非字符:

$ 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.

相关内容