Bash处理管道输出行数多于输入的问题排查
问题根源
你的脚本里,grep -F "${i//\.\//public://}" file_managed.dump.txt这一步可能匹配到了多行结果。当把grep的结果赋值给fid变量时,变量内部会包含换行符。后续执行echo -n "${fid:-$i}"时,这些换行符会被直接输出,导致原本对应输入一行的输出被拆成多行,最终输出文件行数远超输入。
修复方案
给grep加上-m 1参数,强制只返回第一匹配行,确保fid变量只有一行内容:
while IFS=$'\t' read -r -a a do for i in "${a[@]}" do fid=$(grep -m1 -F "${i//\.\//public://}" file_managed.dump.txt|cut -d'(' -f2 |cut -d, -f1| sed 's/[^0-9]//g') echo -n "${fid:-$i}" $'\t' done echo done < dupes.log > fids_dupes.txt
如果需要保留所有匹配的fid但不想拆分行,可以把多行结果用空格替换换行:
fid=$(grep -F "${i//\.\//public://}" file_managed.dump.txt|cut -d'(' -f2 |cut -d, -f1| sed 's/[^0-9]//g' | tr '\n' ' ')
验证方法
找一条可能产生多行匹配的路径,单独执行测试:
grep -F "替换后的目标路径" file_managed.dump.txt
查看输出是否为多行,就能直接确认问题所在。
内容的提问来源于stack exchange,提问作者chx
相关产品推荐
相关产品推荐

