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

如何用sed/awk处理竖线分隔文件:替换第4列Dont开头字段为空?

解决竖线分隔文件的第4字段批量处理问题

你之前的sed命令思路偏了——sed '/^Dont/s/[^|]*//4'是找行首以Dont开头的行再修改第4字段,但我们要的是第4个字段本身以Dont开头的情况,不管行首内容是什么。下面给你两个靠谱的解决方案:

方案一:用awk(推荐,逻辑更直观)

awk处理分隔符文本天生顺手,直接指定分隔符为|,判断第4字段是否符合条件后修改输出即可:

BEGIN {FS=OFS="|"} $4 ~ /^Dont/ {$4=""} 1
  • BEGIN {FS=OFS="|"}:设置输入、输出的分隔符都是竖线,保证输出格式和输入完全一致
  • $4 ~ /^Dont/:判断第4个字段是否以"Dont"开头(正则^Dont表示字段起始位置匹配)
  • {$4=""}:如果符合条件,把第4字段设为空字符串
  • 最后的1:awk里非0值表示执行默认操作(打印当前行),不管是否修改过都会输出

直接在命令行运行的话可以这么写:

awk 'BEGIN {FS=OFS="|"} $4 ~ /^Dont/ {$4=""} 1' your_input_file.txt > output.txt

方案二:用sed(适合偏好sed的场景)

sed需要用正则精准定位第4个字段,思路是捕获前三个字段的内容,再替换第4个字段中以Dont开头的部分:

sed -E 's/^([^|]*\|[^|]*\|[^|]*\|)Dont[^|]*/\1/' your_input_file.txt
  • -E:启用扩展正则表达式,减少转义符号的使用
  • ^([^|]*\|[^|]*\|[^|]*\|):捕获前三个字段加后面的竖线(比如16815966|Mr|Fit 5|)
  • Dont[^|]*:匹配第4字段中以Dont开头的所有内容(直到下一个竖线)
  • \1:替换成之前捕获的内容,相当于把第4字段的Dont开头部分删掉,留空

测试验证

用你提供的示例输入测试,两个命令都会输出你期望的结果:

16815966|Mr|Fit 5||15-07-2015|||||||||||||0|2|0|0.00|0|
21875307|Mr|Father||X|31-12-1899|||||||||||||0|118|0|0.00|0|
19180802|Mr|Dontye|Harr|01-01-1900|||||6666|Avenue||||||06-09-2013|0|26|2|396.00|1|

内容的提问来源于stack exchange,提问作者Dev

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 06:39:25