Bash中仅替换第19-20个分隔符间空白内容的技术求助
解决sed仅替换空字段的问题
你的核心需求是只在第19个与第20个分隔符之间的字段为空时,才将其替换为当前日期,而原来的sed命令会无条件替换该位置的所有内容,不管它是否为空。我们可以通过调整正则表达式实现精准匹配:
最终命令
sed -i "s/\(\([^|]*|\)\{19\}\)\(\|\$\)/\1$(date '+%d\/%m\/%Y')\3/g" *
为什么原来的命令不满足需求?
你原来的命令:
sed -i "s/\(\([^|]*|\)\{19\}\)[^|]*/\1$(date '+%d\/%m\/%Y')/g" *
其中的[^|]*会匹配任何非|的字符序列(包括空字符串),所以无论第20个字段是空还是有内容,都会被替换成当前日期,这不符合你的精准替换要求。
新命令的工作原理
我们拆解一下新的正则逻辑:
\(\([^|]*|\)\{19\}\):捕获前19个字段及其末尾的分隔符(也就是从行首到第19个|的所有内容)\(\|\$\):专门匹配两种空字段场景:\|:第19个|后直接跟着另一个|,说明第20个字段为空且后面还有其他字段\$:第19个|后是行尾,说明第20个字段是最后一个且为空
- 替换逻辑:将捕获的前19段内容
\1,拼接当前日期,再拼接原来的分隔符或行尾\3,这样就只修改空的目标字段,非空字段完全保留。
示例验证
用你提供的示例字符串测试:
227354|SD-PD-100456|P-OD-98767318712|ABC|O|EN|UJ|NM|ABC|ABC;ABC;ABC||98765432||I|A||01/04/2019||||06/04/2020||JU|HINB
假设当前日期是15/10/2024,处理后第19个与第20个|之间的空字段会被替换为15/10/2024,其他非空字段保持原样。
内容的提问来源于stack exchange,提问作者Wolfgang
相关产品推荐
相关产品推荐

