Bash中while read丢失行首空白导致文本筛选错误排查
问题原因
bash 内置的 read 命令默认会以 IFS(内部字段分隔符,默认包含空格、制表符、换行符)作为分隔标记,自动截断读取内容的首尾空白字符,同时默认会处理行内的反斜杠转义符,导致你读到的 $LINE 和原文件行内容不一致。
解决方案
修改 while 读取行的写法,临时清空 IFS 并添加 -r 参数读取即可:
#!/bin/bash TEXT=text.txt Sub=2 # required for the case-statement I have to perform in the real script while IFS= read -r LINE ; do case $Sub:$LINE in # 如果你需要匹配所有#开头的行,不管#后面跟什么,用2:"#"*即可 # 如果要求#后必须跟空格,就保留原来的2:"# "*规则 2:"#"*) printf "%s\n" "$LINE" ;; esac done < "$TEXT"
参数说明
IFS=:仅对当前read命令临时清空 IFS 变量,read就不会自动去除行首行尾的空白,也不会影响全局 IFS 配置-r:禁用反斜杠转义逻辑,保证原行内容原样读取
修改后执行脚本,只会输出行首无空白、直接以 # 开头的行,符合你的筛选需求。
内容的提问来源于stack exchange,提问作者Gjiaffaar
相关产品推荐
相关产品推荐

