Tha*_*Guy 5 linux sed text-processing
我想像这样将命令输入到 sed 中:
md5sum input.txt | sed 's/^\(....\).*/\1/;q'
Run Code Online (Sandbox Code Playgroud)
这仅通过输出校验和的前 4 个字符来工作。但是,我想输出前 4 个字符,但也有一个 x 代替所有其他字符(编辑信息)。我现在很失落。
使用 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)
POSIXly(我认为),您可以使用 sed 循环重复替换x4 个字符前缀后的第一个非字符:
$ md5sum input.txt | sed '
:a
s/^\(....x*\)[^x]/\1x/
ta
'
Run Code Online (Sandbox Code Playgroud)
如果您只想在第一个字段(校验和)中进行替换[^x],[^x ]请替换为。
随着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}来允许不屏蔽前五个字符。