如何用sed基于File2更新File1中的SHA256校验值?
解决方法
问题根源
你循环调用sed处理File2的每一行,每次都会完整读取并输出整个File1,155次循环自然会生成155倍原File1行数的重复内容,这就是核心问题。
正确实现方式
方式一:生成sed批量替换脚本,一次性处理
先把File2的内容转换成sed能识别的替换命令,再用这个脚本一次性处理File1,避免重复遍历:
# 从File2生成sed替换脚本 sed 's/^\(.*\) \(.*\)/s|^\([^ ]* [^ ]* [^ ]* \)\1 .*|\1\2|/' File2 > replace.sed # 用生成的脚本处理File1,输出到新文件 sed -f replace.sed File1 > new_File1
- 第一行命令的作用:把File2里每行的
文件路径 新SHA256值,转换成sed的替换规则——匹配File1中以权限 用户 组 文件路径开头的行,把末尾的旧SHA256值替换成新值。这里用|作为分隔符,避免路径里的/导致替换规则失效。 - 第二行直接调用生成的脚本处理File1,只会输出一次处理后的内容,不会重复。
方式二:用awk高效处理(推荐大文件场景)
awk天生适合处理这种多文件关联的替换操作,代码更简洁,效率也更高:
awk 'NR==FNR {sha[$1]=$2; next} {if ($4 in sha) $5=sha[$4]; print}' File2 File1 > new_File1
- 处理第一个文件(File2)时,把文件路径作为键,新SHA256值作为值,存入数组
sha。 - 处理第二个文件(File1)时,检查第4列(文件路径)是否在
sha数组里,如果存在,就把第5列(旧SHA256值)替换成新值,最后打印整行。
特殊场景处理:文件路径含空格
如果你的文件路径包含空格,上面的字段分割方式会出错,可以用awk指定分隔符来处理:
假设File1格式是权限 用户 组 "带空格的文件路径" SHA256值,File2格式是"带空格的文件路径" 新SHA256值,可以用以下命令:
awk -F'"' 'NR==FNR {path=$2; sha[path]=$4; next} {if ($2 in sha) {sub(/[^ ]*$/, sha[$2])}; print}' File2 File1 > new_File1
内容的提问来源于stack exchange,提问作者Kerkael Belarpaillon
相关产品推荐
相关产品推荐

