sed:查找并替换以特定字符串开头的行中的第 n 个字符

Posted

技术标签:

【中文标题】sed:查找并替换以特定字符串开头的行中的第 n 个字符【英文标题】:sed: find and replace nth character in a line that starts with a specific string 【发布时间】:2020-12-25 08:13:38 【问题描述】:

我有几千个具有相同行格式的文件。我试图替换以字符串(单词“ATOM”)开头的每一行中的第 17 个字符(一个字母),而不更改文件中的任何其他内容。例如,我想将 ATOM 后面的第 17 个字符从“D”替换为“A”:

输入

原子 14632 2HG2 VAL D 923 56.949 47.137 72.598 1.00 0.00 H

输出

原子 14632 2HG2 VAL A 923 56.949 47.137 72.598 1.00 0.00 H

我正在使用以下代码,它更改了字母,但删除了该行中它之前的所有内容:

sed -i '.bak' 's/^\(ATOM.\17\\)D/\A/' input.file

输出

A 923 56.949 47.137 72.598 1.00 0.00 H

对于我在这里做错的任何帮助将不胜感激。

'.bak' 就在那里,因为我在 Mac 上。

【问题讨论】:

使用awk。就像字面上的awk '$1 == "ATOM" && $5 == "D" $5 = "A" 是否必须是“第17 个字符”并且可能是“第5 个字段”?文件中的字段不是用空格分隔的吗? 嗯,很有趣。在这种类型的文件中,每个字符都是它自己的列,因此该字母将属于第 22 列。不幸的是,在此列中有更多不需要替换的字母的行,因此需要仅识别带有 ATOM 的行他们。 【参考方案1】:

是:

sed 's/^\(ATOM.\16\\)D/\1A/'
.\16\ - 你说的是 I'd like to replace the 17th character after the word ATOM from "D" to "A"。所以你想匹配任何 16 个字符,然后匹配第 17 个字符,即D\1 - 将记忆中的第一个 \(...\) 放在那里。 A - 后跟 A

【讨论】:

感谢KamilCuk,几乎成功了!除了我确实需要 17 ......它并没有与那里的 16 做出改变。然后我也使用了“。”而不是 17,只是将每个字母更改为“A”。

以上是关于sed:查找并替换以特定字符串开头的行中的第 n 个字符的主要内容,如果未能解决你的问题,请参考以下文章

如何避免以特定符号开头的行中字符串的文本突出显示[java]

如何用sed命令替换一行中的某个字符串

sed命令练习

shell脚本应用正则表达式grep,sed,awk,的应用

shell脚本应用正则表达式grep,sed,awk,的应用

Sed命令替换文件中的第一个出现[重复]