sed从所选文本替换第8位的空格字符

时间:2016-08-31 08:11:17

标签: linux bash vim sed

我在我们公司的dhcp服务器的配置文件中添加了很长的主机列表。

条目如下所示:

host s1 { hardware ethernet b4:e1:0f:06:cb:83; fixed-address 192.168.10.43; }
host s2 { hardware ethernet b4:e1:0f:06:cb:90; fixed-address 192.168.10.64; }
host s3 { hardware ethernet b4:e1:0f:06:cb:9d; fixed-address 192.168.10.44; }
host s4 { hardware ethernet b4:e1:0f:06:cb:aa; fixed-address 192.168.10.65; }
host s5 { hardware ethernet b4:e1:0f:06:cb:b7; fixed-address 192.168.10.41; }
host s6 { hardware ethernet b4:e1:0f:06:cb:c4; fixed-address 192.168.10.35; }
host s7 { hardware ethernet b4:e1:0f:06:cb:d1; fixed-address 192.168.10.36; }
host s8 { hardware ethernet b4:e1:0f:06:cb:de; fixed-address 192.168.10.67; }
host s9 { hardware ethernet b4:e1:0f:06:cb:eb; fixed-address 192.168.10.72; }

我正在使用vim编辑文件。如何用类似.domain.com的东西替换位置8的空格字符? (我指的是s1之后的空格char,s2等

我已尝试使用sed进行不同的配置和模式,但出于某种原因,我无法让它工作。

另一种方法是用我想要的替换空间+ {但这不是我想要的解决方案。

此致

4 个答案:

答案 0 :(得分:3)

(这是 Vim 答案)

您可以将第7列之后的第一个空格替换为:

:%s/\%>7c /.domain.com

但你的台词不会很漂亮:

host s1.domain.com{ hardware ethernet b4:e1:0f:06:cb:83; fixed-address 192.168.10.43; }

相反,您可以将该空间单独留下:

:%s/\%8c/.domain.com

并获得此:

host s1.domain.com { hardware ethernet b4:e1:0f:06:cb:83; fixed-address 192.168.10.43; }

或者你可以用一个简单的宏来做到这一点:

:%normal! 2f i.domain.com<CR>

答案 1 :(得分:1)

您可以使用此sed

sed 's/host [^ ]*/&.domain.com/g' file

答案 2 :(得分:1)

使用sed,基于字符数:

sed 's/\(.\{7\}\) /\1domain.com/' file

要编辑文件,请添加-i选项:

sed -i 's/\(.\{7\}\) /\1domain.com/' file

答案 3 :(得分:1)

使用Vim:

.domain.com添加到每行的第二个单词上
:%s/\v^(\s*\w+){2}\zs/.domain.com/

使用sed

sed -r 's/ +/.domain.com /2' file.txt

使用awk

awk '{ $2 = $2 ".domain.com" } 1' file.txt