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

sed:查找并替换以特定字符串开头的行中的第n个字符,sed,regexp-replace,Sed,Regexp Replace,我有几千个相同行格式的文件。我试图替换以字符串(单词“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 我正在使用以下代码,它更改了字母,但删除了该行中该字母之前的所有

我有几千个相同行格式的文件。我试图替换以字符串(单词“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小时

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

“.bak”在那里,因为我在Mac上。

它是:

sed 's/^\(ATOM.\{16\}\)D/\1A/'
  • \{16\}
    -你说的
    我想把ATOM这个词后面的第17个字符从“d”改为“A”
    。因此,您需要匹配任何16个字符,然后匹配第17个字符,即
    D
  • \1
    -将第一个
    \(…\)
    记住的内容放在那里
  • A
    -后跟
    A

使用
awk
。就像字面上的
awk'$1==“ATOM”&&&$5==“D”{$5=“A”}
它必须是“第17个字符”并且可能是“第5个字段”吗?文件中的字段不是用空格分隔的吗?嗯,很有趣。在这种类型的文件中,每个字符都是它自己的列,因此此字母将归入第22列。不幸的是,本栏中有更多的行不需要替换字母,因此只需要识别其中包含ATOM的行。感谢KamilCuk,这几乎成功了!除了我确实需要17号……16号没有改变。然后我用“.”而不是17把每个字母改成“A”。