用sed替换一行内的字符

时间:2017-08-10 14:18:05

标签: bash sed

我有一个充满以下行的文件:

ATOM  27576  OT2 TYR X 360      33.646  13.165  20.334  1.00  1.00      PROE

我想将其转换为:

ATOM  27576  OT2 TYR E 360      33.646  13.165  20.334  1.00  1.00      PROE

换句话说,将PRO的最后一个字母放在X所在的位置。 X是文件中的常量,但PRO后缀不同。是否可以使用单行sed命令实现它?

4 个答案:

答案 0 :(得分:2)

只需使用捕获组:

<强> sed 's/TYR X \(.*\)PRO\(.*\)$/TYR \2 \1PRO\2/'

$ echo "ATOM 27576 OT2 TYR X 360 33.646 13.165 20.334 1.00 1.00 PROE" | sed 's/TYR X \(.*\)PRO\(.*\)$/TYR \2 \1PRO\2/'
ATOM 27576 OT2 TYR E 360 33.646 13.165 20.334 1.00 1.00 PROE

答案 1 :(得分:1)

awk 解决方案更适合此类情况:

awk '{ $5=substr($NF,length($NF)) }1' file

答案 2 :(得分:1)

您可以使用此sed:

sed -i '' -E 's/ X( .*PRO([A-Za-z]))/ \2\1/' file
ATOM 27576 OT2 TYR E 360 33.646 13.165 20.334 1.00 1.00 PROE

答案 3 :(得分:0)

反向引用的创造性使用:

sed 's/^\(.\+\) X \(.\+\) \(...\)\(.\)$/\1 \4 \2 \3\4/'