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

如何在Shell脚本中使用sed命令选择固定位置子串并完成替换

解决sed固定位置子串替换的问题

你的现有命令已经完成了空格清理、分隔符替换和前后加引号的工作,核心问题是缺少对第二个字段的子串截取处理。我们只需要在现有步骤中插入一步对第二个字段的修改,就能得到你想要的结果。

方案一:固定去除第二个字段的前4位

如果第二个字段的前4位(0012)是固定需要去掉的部分,可以用这个命令:

echo " X|001200000000000000000098765432|1234567890|TQ" | sed "s/ *//g; s/\([^|]*\)|\([0-9]\{4\}\)\([^|]*\)|\([^|]*\)|\([^|]*\)/\1|\3|\4|\5/; s/|/‘,’/g; s/^/‘/; s/$/‘/"

步骤解释:

  1. s/ *//g:清除所有空格,得到干净的X|001200000000000000000098765432|1234567890|TQ
  2. s/\([^|]*\)|\([0-9]\{4\}\)\([^|]*\)|\([^|]*\)|\([^|]*\)/\1|\3|\4|\5/:
    • 通过正则分组捕获整个行的各个部分,其中\([0-9]\{4\}\)专门捕获第二个字段的前4位数字
    • 替换时丢弃这前4位,只保留第二个字段剩余的部分
  3. 后续的|/‘,’/g; s/^/‘/; s/$/‘/就是你原来的逻辑,完成分隔符替换和前后加引号的操作

方案二:提取第二个字段的最后14位

如果你的需求是不管第二个字段前面有多少位,只保留最后14位(正好匹配你要的00000098765432),可以用这个命令:

echo " X|001200000000000000000098765432|1234567890|TQ" | sed "s/ *//g; s/\([^|]*\)|\([0-9]*\)\([0-9]\{14\}\)|\([^|]*\)|\([^|]*\)/\1|\3|\4|\5/; s/|/‘,’/g; s/^/‘/; s/$/‘/"

这个命令的核心是\([0-9]*\)\([0-9]\{14\}\),它会捕获第二个字段中“任意长度数字 + 最后14位数字”,替换时只保留最后14位。

运行上述任意一个命令,都能得到你想要的结果:‘X’,’00000098765432’,’1234567890’,’TQ’

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 20:39:07