使用 bash 脚本编辑配置文件

问题描述 投票:0回答:4

我有一个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
sed
4个回答
3
投票

尝试使用

sed
范围:

sed -i '/Host server1/,/HostName/ s/HostName .*/HostName 14.208.54.132/' .ssh/config

这将替换

HostName
和第一次出现
Host server1
之间的行范围内的
HostName
,我认为这就是您想要的。


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/)
与该主机名不匹配。


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

0
投票

这可能对你有用(GNU sed):

sed '/\<server1\>/{:a;n;/HostName/!ba;s/\S\+/14.208.54.132/2}' file

聚焦于包含

server1
的行,然后阅读其他行,直到包含
HostName
的行,并将第二个字段替换为所需结果。

© www.soinside.com 2019 - 2024. All rights reserved.