Sed 使用bash脚本编辑配置文件
我有一个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
.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,语法也很简单。