如何用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
相关产品推荐
相关产品推荐

