Shell脚本while循环中sed删除首行后首行仍存在的问题求解
问题原因排查
- 你当前写的
sed '1d' $dataFile只会把删除首行后的内容输出到标准输出,没有写入原文件,所以原文件不会产生任何改动,首行自然会保留。 - 现有循环没有加终止条件,属于无限循环逻辑,就算后续补了写入原文件的逻辑,会一直删文件的首行直到文件内容全部被清空,不符合正常业务需求。
- 循环内反复操作同一个原文件,没有临时文件兜底,一旦操作出错容易丢失全部数据。
解决方法
方法1:使用sed内置原地修改参数(最简便)
大部分Linux发行版默认带的GNU sed支持-i参数,可直接修改原文件:
# 直接原地删除$dataFile的第一行 sed -i '1d' "$dataFile"
如果是macOS系统自带的BSD sed,-i需要额外指定备份文件后缀,不需要备份的话传入空字符串即可:
sed -i '' '1d' "$dataFile"
方法2:手动通过临时文件处理(兼容性最高)
如果需要适配所有Unix环境,不依赖不同版本sed的参数差异,可以手动走临时文件流程:
# 先将删除首行后的内容写入临时文件 sed '1d' "$dataFile" > "$tempfile" # 再用临时文件覆盖原文件 mv "$tempfile" "$dataFile"
现有循环逻辑修正参考
如果你需要循环读取文件每行处理,每次处理完删除首行,修正后的逻辑如下:
# 只有数据文件存在且非空的时候才执行循环 while [ -s "$dataFile" ] do head -1 "$dataFile" > "$tempfile" err_count=0 # 此处可补充你自己的业务逻辑修改err_count if [ "$err_count" -ne 0 ] then echo "Error count is not zero" # 出错后可根据需求加break终止循环或其他处理逻辑 fi # 删除首行并写回原文件 sed -i '1d' "$dataFile" done
注意:如果处理的是大文件,循环每次调用sed删首行的性能会非常差,建议一次性把文件内容读入数组处理,或者用awk批量处理,效率会高很多。
内容的提问来源于stack exchange,提问作者Lavender
相关产品推荐
相关产品推荐

