How can you replace a character at a specific index in a line in vim?

时间:2016-05-11 11:36:52

标签: shell vim replace sed

I need to replace a character (it can be either X, L,H,1,0) in a specific index in some specific line in a file using vim/sed/awk etc.

Eg:

File:

0101010HLHLHLHL
1010100LHHHLHLH
1000000HHLLHHLL
LHLHLHLHLLLLHLH

So I need to replace 8th character in line 2 to X.

0101010HLHLHLHL
1010100XHHHLHLH
1000000HHLLHHLL
LHLHLHLHLLLLHLH

5 个答案:

答案 0 :(得分:3)

您可以使用此USE CPC3;

sed

使用sed '2s/./X/8' file 选项进行就地编辑。

下面,

  • -i - 行号
  • 2 - 仅在s/./X/8出现时将.(匹配任何一个字符)替换为X

答案 1 :(得分:2)

我的第一篇ed

ed -s file <<<$'e\n2s/./X/8\nw'

有3个命令,每个命令由换行符\n分隔。我正在使用bash所以我已经选择了一个herestring <<<的组合来通过标准输入和一个&#34; C字符串传递命令&#34;使用$'',以便我可以使用\n作为换行符。

这三个命令是:

  • e:编辑
  • 2/s/./X/8:在第二行,将第8个字符替换为X
  • w写文件

-s会抑制命令的任何输出。

答案 2 :(得分:2)

使用GNU awk for gensub():

$ awk -v i=8 'NR==2{$0 = gensub(/./,"X",i)} 1' file
0101010HLHLHLHL
1010100XHHHLHLH
1000000HHLLHHLL
LHLHLHLHLLLLHLH

其他问题:

$ awk -v i=8 'NR==2{$0 = substr($0,1,8-1) "X" substr($0,i+1)} 1' file
0101010HLHLHLHL
1010100XHHHLHLH
1000000HHLLHHLL
LHLHLHLHLLLLHLH

答案 3 :(得分:0)

在Vim中,如果您在第1行的文件中:

j8lrX

如果你在另一条线上:

2G8lrX

如果您不在档案中:

vim file +2 +normal\!\ 8lrX
  • +2表示:打开文件并将光标移动到第2行。
  • +normal\!\ 8lrXZZ表示:在vim中执行:normal! 8lrX

您也可以使用ZZ直接保存。

答案 4 :(得分:0)

这是一个vim单行::2,2s/\(.\{7\}\)./\1X/

说明:

  1. :2,2s///确保仅替换第二行。
  2. ^\(.\{7\}\).将前7个字符匹配到一个组中,然后将第8个字符匹配到组外
  3. \1X是替代品:\1是第一个匹配的组,即前7个字符。然后X是您指定的替代品。