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

Tha*_*Guy 5 linux sed text-processing

我想像这样将命令输入到 sed 中:

md5sum input.txt | sed 's/^\(....\).*/\1/;q'
Run Code Online (Sandbox Code Playgroud)

这仅通过输出校验和的前 4 个字符来工作。但是,我想输出前 4 个字符,但也有一个 x 代替所有其他字符(编辑信息)。我现在很失落。

Qua*_*odo 6

使用 GNU Sed,

md5sum input.txt | sed 's/./x/5g'
Run Code Online (Sandbox Code Playgroud)

这只是跳过替换字符串的前 4 个字符并执行所有其他字符的替换。

使用 Awk 的 POSIX 替代方案(尽管可能有更简单的方法),

md5sum xad | awk '{
  four=substr($0, 1, 4)
  rest=substr($0, 5)
  gsub(/./, "x", rest)
  print four, rest
}' OFS=""
Run Code Online (Sandbox Code Playgroud)


ste*_*ver 5

POSIXly(我认为),您可以使用 sed 循环重复替换x4 个字符前缀后的第一个非字符:

$ md5sum input.txt | sed '
:a
s/^\(....x*\)[^x]/\1x/
ta
'
Run Code Online (Sandbox Code Playgroud)

如果您只想在第一个字段(校验和)中进行替换[^x][^x ]请替换为。


Sun*_*eep 5

随着perl如果GNU sed不可用:

md5sum input.txt | perl -pe 's/^.{4}(*SKIP)(*F)|./x/g'
Run Code Online (Sandbox Code Playgroud)

^.{4}(*SKIP)(*F) 将阻止替换前四个字符

|. 指定必须替换的替代模式


仅更改校验和:

md5sum ip.txt | perl -pe 's/(^.{4}|\h.*$)(*SKIP)(*F)|./x/g'
Run Code Online (Sandbox Code Playgroud)

如果md5sum输出以 a 开头\(例如:如果文件名有换行符),那么您可以使用^\\?.{4}代替^.{4}来允许不屏蔽前五个字符。