我有一个bash脚本需要修改
.ssh/config
。我的目标是使用 HostName
更改 server1
的 sed
值,我已经设法做到了,但文件中有更多 HostName
和 sed
全部修改。我尝试指定 sed
在第一次出现时停止,但继续修改它们。
这是我需要更改
HostName
的
server1
的文件
Host server1
HostName 172.160.189.196
User admin
Port 353
Host server2
HostName 254.216.34.18
User user
Port 22
这是我给出的命令:
sed -i '0,/RE/s/HostName .*/HostName 14.208.54.132/' .ssh/config
虽然众所周知 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/)
与该主机名不匹配。
您可以像这样使用
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
这可能对你有用(GNU sed):
sed '/\<server1\>/{:a;n;/HostName/!ba;s/\S\+/14.208.54.132/2}' file
聚焦于包含
server1
的行,然后阅读其他行,直到包含 HostName
的行,并将第二个字段替换为所需结果。