bash - 如何用字符串替换一行中特定范围的位置?

标签 bash sed

我有一个文件 ($pdbin),其中的行遵循特定格式。我正在尝试使用 sed 将字符 57-60 替换为字符串变量 $o,仅在匹配两个特定模式(包含 HETATM 和 NO)的行上。

这是我要修改的示例行,其中突出显示了我要更改的字符:

HETATM 1111  N   NO  A 204       4.938  19.295  -6.772  1.00 37.21           N
                                                        ^^^^

这是我的 sed 命令,它替换了正确的字符(并保存到新文件 $xyzin),但通过搜索 1.00,而不是使用位置上线:

sed "/HETATM/{/NO/{s/1.00/$o/g}}" $pdbin > $xyzin

我想要替换的变量$o0.12

如何修改此命令以在位置 57-60 上进行操作,以便在我要替换的字符串与 1.00 不匹配时它可以工作?

最佳答案

您可以捕获捕获组中的前 56 个字符,并使用反向引用将其放回替换位置:

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

cat "$xyzin"
HETATM 1111  N   NO  A 204       4.938  19.295  -6.772  0.12 37.21           N

关于bash - 如何用字符串替换一行中特定范围的位置?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/76433132/

相关文章:

linux - 使用 grep 解析多行变量

bash - 如何在 Bash 中生成随机数?

linux - 如何将进程置于 Chef 的后台,类似于来自终端的 Ctrl + Z

linux - KDE 服务菜单问题

linux - 无法获得这个简单的 sed 命令

bash - 提取子字符串直到第一个数字

c - 我怎样才能暂停然后恢复对 `sleep` 的调用

bash - 如何在 bash 中将列除以常量

Linux命令用另一个字符串替换大文件中的字符串

linux - 如何获得与 sed 的第一场比赛?