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

如何用sed替换含HETATM和NO行的57-60位字符为变量$o?

基于sed按位置替换指定行的字符

问题描述

我有一个格式固定的文件$pdbin,希望使用sed工具,仅在同时包含HETATM和NO的行中,将第57-60位的字符替换为字符串变量$o(当前值为0.12)。我现有的sed命令是通过匹配“1.00”完成替换并保存到$xyzin,但该命令无法适配替换内容不是1.00的情况,请问如何修改命令以基于位置进行替换?

解决方案

直接使用sed的正则分组匹配实现按位置替换,无需依赖目标位置的原有内容,命令如下:

sed -e "/HETATM.*NO/s/^\(.\{56\}\).\{4\}/\1$o/" "$pdbin" > "$xyzin"

命令说明

  • /HETATM.*NO/:仅对同时包含HETATM和NO的行执行替换操作(如果HETATM固定在行首,可改为/^HETATM.*NO/进一步精准匹配)
  • s/^\(.\{56\}\).\{4\}/\1$o/:
    • ^\(.\{56\}\):捕获行开头的前56个字符,保存为分组1
    • .\{4\}:匹配第57-60位的4个字符
    • \1$o:将匹配到的部分替换为“前56个字符 + 变量$o的值”,行中剩余内容保持不变
  • 必须用双引号包裹sed脚本,确保shell能正确展开$o变量

如果需要兼容HETATM和NO顺序不确定的场景(虽然PDB文件中极少出现),可以改用以下命令:

sed -e "/HETATM/!b; /NO/!b; s/^\(.\{56\}\).\{4\}/\1$o/" "$pdbin" > "$xyzin"

补充说明

  • /HETATM/!b:行不包含HETATM则直接跳过
  • /NO/!b:行不包含NO则直接跳过
  • 只有同时满足两个条件的行才会执行后续的位置替换

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 23:07:24