使用bash脚本编辑配置文件

时间:2019-08-15 14:50:39

标签: sed

我有一个bash脚本,需要修改.ssh/config。我的目标是使用HostName来更改server1的{​​{1}}值,我已经设法做到了,但是文件中有更多的sed和{{1} }修改它们。我曾尝试指定HostName在第一次出现时停止,但会继续修改它们。

这是我需要更改sed的{​​{1}}的文件

sed

这是我给的命令:

HostName

4 个答案:

答案 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的行,并用第二个字段替换所需的结果。