Regex Bash for循环打印意外输出,为什么?

Regex Bash for循环打印意外输出,为什么?,regex,bash,awk,sed,Regex,Bash,Awk,Sed,我编写了一个脚本,查询AWS Route53上的dns区域并返回特定服务器的IP 目标是在启动CloudFormation堆栈后运行此脚本,该脚本将使用更新的服务器IP更新我的本地~/.ssh/config文件 我想“捕获”配置中以主机名开头但与我要编辑的服务器主机名相关的行,因此我运行了以下命令: $ grep -A2 dev-api2.company-private ~/.ssh/config Host dev-api2.company-private User ec2-user HostN

我编写了一个脚本,查询AWS Route53上的dns区域并返回特定服务器的IP

目标是在启动CloudFormation堆栈后运行此脚本,该脚本将使用更新的服务器IP更新我的本地
~/.ssh/config
文件

我想“捕获”配置中以主机名开头但与我要编辑的服务器主机名相关的行,因此我运行了以下命令:

$ grep -A2 dev-api2.company-private ~/.ssh/config
Host dev-api2.company-private
User ec2-user
HostName 5.5.5.5
接下来,我运行:

$ for line in $(grep -A2 dev-api2.company-private ~/.ssh/config); do echo $line  ; done
Host
dev-api2.company-private
User
ec2-user
HostName
5.5.5.5
由于某些原因,输出并不像我预期的那样打印,它将每个单词分隔成一行,但为什么会发生这种情况

编辑#1: 我的想法是这样做:

for line in $(grep -A2 dev-api2.company-private ~/.ssh/config)
do
    if [[ $line == "^HostName.*" ]]
    then
        sed -i 's!$line!HostName 1.1.1.1!g' ~/.ssh/config
    fi
done
Host as-bastion
User ec2-user
HostName ec2-34.us-west-2.compute.amazonaws.com
IdentityFile ~/.ssh/company/bastion.pem

Host dev-api1.company-private
User ec2-user
HostName 172.51.24.171
IdentityFile ~/.ssh/company/company.pem
ProxyCommand ssh ec2-user@as-bastion -W %h:%p

Host dev-api2.company-private
User ec2-user
HostName 172.51.25.248
IdentityFile ~/.ssh/company/company.pem
ProxyCommand ssh ec2-user@as-bastion -W %h:%p
编辑#2: 好的,
~/.ssh/config
文件的相关部分如下所示:

for line in $(grep -A2 dev-api2.company-private ~/.ssh/config)
do
    if [[ $line == "^HostName.*" ]]
    then
        sed -i 's!$line!HostName 1.1.1.1!g' ~/.ssh/config
    fi
done
Host as-bastion
User ec2-user
HostName ec2-34.us-west-2.compute.amazonaws.com
IdentityFile ~/.ssh/company/bastion.pem

Host dev-api1.company-private
User ec2-user
HostName 172.51.24.171
IdentityFile ~/.ssh/company/company.pem
ProxyCommand ssh ec2-user@as-bastion -W %h:%p

Host dev-api2.company-private
User ec2-user
HostName 172.51.25.248
IdentityFile ~/.ssh/company/company.pem
ProxyCommand ssh ec2-user@as-bastion -W %h:%p
该文件包含许多与上面类似的块,但我只想使用包含我在grep(dev-api2.company private)中使用的字符串的块的“HostName”行

@anubhava:答案中的代码更改了包含字符串“HostName”的行,即使在与“dev-api2.company private”无关的块中也是如此


如何做到这一点?

您应该在使用进程替换读取循环时使用此
,而不是使用命令替换读取
循环:

要保存更改,请使用此
awk
命令:

awk -v ORS='\n\n' -v RS= -v api='^Host dev-api2' -v ip='1.1.1.1' '
$0 ~ api "\\.company-private$" {sub(/\nHostName [^\n]+/, "\nHostName " ip)} 1
' ~/.ssh/config > $$.tmp && mv $$.tmp ~/.ssh/config

这里有一个liner
sed
来完成相同的工作:

sed -i.bak '/dev-api2\.company-private/{N;p;N;s/.*/HostName 1.1.1.1/;}' ~/.ssh/config

我收到以下错误:
sed:1:“/Users/itai/.ssh/config”:我需要的命令\后跟文本,您知道如何修复它吗?谢谢你的快速回复。是的,我已经用bash-shebang将你的代码插入到一个文件中,并在我的mac上运行了它。太棒了!你太棒了。@ItaiGanot:你可以使用:
awk-v-api='dev-api2'-v-ip='1.1.1'$0~api'\.company private'{p=NR}p&&NR==p+2&/^HostName/{$0=“HostName”ip;p=0}1'~/.ssh/config
@EdMorton:谢谢你的宝贵提示。我已经用
awk
命令更新了答案,使用
vrs=
读取并