Sed 使用bash脚本编辑配置文件

Sed 使用bash脚本编辑配置文件,sed,Sed,我有一个bash脚本需要修改.ssh/config。我的目标是使用sed更改server1的HostName值,我已经做到了,但是在文件中有更多HostName和sed修改了它们。我已尝试指定要在第一次出现时停止的sed,但仍在继续修改它们 这是我需要更改server1的HostName的文件 Host server1 HostName 172.160.189.196 User admin Port 353 Host server2 HostName 254.2

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

这是我需要更改
server1的
HostName
的文件

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

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

您可以像这样使用
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

尝试使用
sed
范围:

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

这将替换
主机服务器1
和第一个出现的
主机名
之间的行范围内的
主机名
,我想这正是您想要的。

尝试使用
sed
范围:

sed -i '/Host server1/,/HostName/ 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通常用于行,但默认情况下它实际上用于记录行。记录可以由记录分隔符
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/)
与此不匹配。

这可能适用于您(GNU-sed):

sed'/\/{:a;n;/HostName/!ba;s/\s\+/14.208.54.132/2}文件
关注包含
server1
的行,然后读取其他行,直到其中一行包含
HostName
并用第二个字段替换所需的结果。

这可能适用于您(GNU-sed):

sed'/\/{:a;n;/HostName/!ba;s/\s\+/14.208.54.132/2}文件

关注包含
server1
的行,然后读取其他行,直到其中包含
HostName
的行,并用第二个字段替换所需的结果。

什么是
/RE/
0,/RE/
允许正则表达式也匹配第一行。换句话说:这样的地址将创建一个从第一行到匹配
re
的行的范围,包括该行-无论
re
发生在第一行还是任何后续行。什么是
/re/
0,/re/
也允许正则表达式在第一行匹配。换句话说:这样的地址将创建一个范围,从第1行到与
re
匹配的行,并包括该行-无论
re
发生在第1行还是任何后续行。如果有“User userver1”这样的行,这可能会失败如果有“User userver1”这样的行,这可能会失败我尝试了所有三个答案,它们都有效,但我选择这个答案的原因很简单,它使用sed,语法也很简单。我尝试了所有三个答案,它们都有效,但我选择这个答案的原因很简单,它使用sed,语法也很简单。