You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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个字段是空还是有内容,都会被替换成当前日期,这不符合你的精准替换要求。

新命令的工作原理

我们拆解一下新的正则逻辑:

  1. \(\([^|]*|\)\{19\}\):捕获前19个字段及其末尾的分隔符(也就是从行首到第19个|的所有内容)
  2. \(\|\$\):专门匹配两种空字段场景:
    • \|:第19个|后直接跟着另一个|,说明第20个字段为空且后面还有其他字段
    • \$:第19个|后是行尾,说明第20个字段是最后一个且为空
  3. 替换逻辑:将捕获的前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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 09:02:35