我有一个bash脚本,需要修改.ssh/config
。我的目标是使用HostName
来更改server1
的{{1}}值,我已经设法做到了,但是文件中有更多的sed
和{{1} }修改它们。我曾尝试指定HostName
在第一次出现时停止,但会继续修改它们。
这是我需要更改sed
的{{1}}的文件
sed
这是我给的命令:
HostName
答案 0 :(得分:1)
尝试使用sed
范围:
sed -i '/Host server1/,/HostName/ s/HostName .*/HostName 14.208.54.132/' .ssh/config
这将替换HostName
和第一次出现Host server1
之间的行范围内的HostName
,我认为这是您想要的。
答案 1 :(得分:0)
您可以像这样使用awk
:
awk '$2=="server1" {f=1} f && /HostName/ {$0=" HostName 14.208.54.132";f=0} 1' file
Host server1
HostName 14.208.54.132
User admin
Port 353
Host server2
HostName 254.216.34.18
User user
Port 22
答案 2 :(得分:0)
虽然众所周知awk可在行上运行,但实际上它在默认情况下可用于记录。记录可以由记录分隔符RS
定义。如果此变量为空,则假定一条记录是由一个或多个空行分隔的文本块给出的。使用此工具,您可以执行以下操作:
awk 'BEGIN{RS="";FS=OFS="\n";ORS="\n\n"}
($1~/server1/) {sub(/Hostname[^\n]*\n/,"Hostname 14.208.54.132" OFS)}
1' file
这并不短,但从概念上讲是干净的。
显然,您必须更新正则表达式以使其与主机名匹配,以使其唯一。如果您还具有主机名server1a
,则必须确保($1~/server1/)
与之不匹配。
答案 3 :(得分:0)
这可能对您有用(GNU sed):
sed '/\<server1\>/{:a;n;/HostName/!ba;s/\S\+/14.208.54.132/2}' file
关注包含server1
的行,然后读取其他行,直到包含HostName
的行,并用第二个字段替换所需的结果。