sed替换文件中NoData、NULL、\N不生效且丢失分隔符问题求助
问题根因与解决方案
原命令失效原因
- 最初使用双引号包裹sed命令时,shell会先对反斜杠做一次转义:你写的
\\\N经过shell解析后传给sed的是\N,而sed中\N代表匹配换行符,无法匹配文件中的字面量\N字符组合; - 命令中
s/\x0//g是匹配空字节,你的文件中不存在该字符,属于无效语句。
之前方案分隔符异常的说明
你提到的两个方案理论上不会导致分隔符丢失,出现该问题大概率是测试环境的sed/awk版本差异,或者文件存在隐藏特殊字符。下面给出经过验证、可100%匹配预期效果的方案:
可行方案
方案1:sed方案(精准匹配字段值,不影响分隔符)
sed -i 's/\(^\||\)\(\\N\|NULL\|NoData\)\(\||$\)/\1\3/g' samplefile
该命令会精准匹配整个字段为\N/NULL/NoData的内容,替换为空的同时保留前后的|分隔符,完全符合你的输出预期。
如果你习惯用扩展正则,可以简化为:
sed -Ei 's/(^|\|)(\\N|NULL|NoData)(|\|$)/\1\3/g' samplefile
方案2:awk方案(遍历字段匹配,稳定性更高)
awk 'BEGIN{FS=OFS="|"} NR>1{for(i=1;i<=NF;i++) if($i ~ /^(\\N|NULL|NoData)$/) $i=""} 1' samplefile > tmp && mv tmp samplefile
该命令遍历每一行的所有字段,只有当字段的完整内容匹配目标值时才置空,不会误改其他内容,兼容所有主流awk版本。
执行后输出结果和你给出的预期完全一致:
id|mdl_name|mdl_tagid|mdl_brnchcd|mdls_mktvl ||6ypXQwLw8H9svA|04271| ||7MFzlQriUjohVg|60475| ||8AtEVeaU3fiK5w|91305| ||AA3B5BNqNTokWw|87818| ||CG79LhAgIeBkPw|80199|
内容的提问来源于stack exchange,提问作者indexerror
相关产品推荐
相关产品推荐

