为什么我的awk重定向不起作用?

时间:2016-11-19 01:17:54

标签: bash awk io-redirection

我试图重定向我的输出以替换我的文件的内容,但如果我这样做,它根本不会改变我的输出

#!/bin/bash

ssh_config_path="$HOME/.ssh/config"
temp_ssh_config_path="$HOME/.ssh/config_temporary"

new_primary_username=$1
curr_primary_username=`awk '/^Host github\.com$/,/#Username/{print $2}' $ssh_config_path | tail -1`
new_user_name=`awk "/^Host github-$new_primary_username$/,/#Name/{print $2}" $ssh_config_path | tail -1 | sed 's/#Name //' | sed -e 's/^[[:space:]]*//' -e 's/[[:space:]]*$//'`
new_user_email=`awk "/^Host github-$new_primary_username$/,/#Email/{print $2}" $ssh_config_path | tail -1 | sed 's/#Email //' | sed -e 's/^[[:space:]]*//' -e 's/[[:space:]]*$//'`

echo "Switching from $curr_primary_username to $new_primary_username"
echo "Setting name to $new_user_name"
echo "Setting email to $new_user_email"

awk "
 !x{x=sub(/github-$new_primary_username/,\"github.com\")}
 !y{y=sub(/github\.com/,\"github-$curr_primary_username\")}
 1" $ssh_config_path > temp_ssh_config_path && mv temp_ssh_config_path ssh_config_path

但如果我这样做,我会在终端屏幕上得到正确的输出

#!/bin/bash

ssh_config_path="$HOME/.ssh/config"
temp_ssh_config_path="$HOME/.ssh/config_temporary"

new_primary_username=$1
curr_primary_username=`awk '/^Host github\.com$/,/#Username/{print $2}' $ssh_config_path | tail -1`
new_user_name=`awk "/^Host github-$new_primary_username$/,/#Name/{print $2}" $ssh_config_path | tail -1 | sed 's/#Name //' | sed -e 's/^[[:space:]]*//' -e 's/[[:space:]]*$//'`
new_user_email=`awk "/^Host github-$new_primary_username$/,/#Email/{print $2}" $ssh_config_path | tail -1 | sed 's/#Email //' | sed -e 's/^[[:space:]]*//' -e 's/[[:space:]]*$//'`

echo "Switching from $curr_primary_username to $new_primary_username"
echo "Setting name to $new_user_name"
echo "Setting email to $new_user_email"

awk "
 !x{x=sub(/github-$new_primary_username/,\"github.com\")}
 !y{y=sub(/github\.com/,\"github-$curr_primary_username\")}
 1" $ssh_config_path

1 个答案:

答案 0 :(得分:2)

令人失望的是你已经从你给出的答案中走了多远,但无论如何这里都是你脚本的正确语法(未经测试,因为你没有提供任何样本输入/输出):

#!/bin/bash

ssh_config_path="$HOME/.ssh/config"
temp_ssh_config_path="$HOME/.ssh/config_temporary"

new_primary_username="$1"
curr_primary_username=$(awk 'f&&/#Username/{print $2; exit} /^Host github\.com$/{f=1}' "$ssh_config_path")
new_user_name=$(awk -v npu="$new_primary_username" 'f&&/#Name/{print $2; exit} $0~"^Host github-"npu"$"{f=1}' "$ssh_config_path")
new_user_email=$(awk -v npu="$new_primary_username" 'f&&/#Email/{print $2; exit} $0~"^Host github-"npu"$"{f=1}' "$ssh_config_path")

echo "Switching from $curr_primary_username to $new_primary_username"
echo "Setting name to $new_user_name"
echo "Setting email to $new_user_email"

awk -v npu="$new_primary_username" -v cpu="$curr_primary_username" '
 !x{x=sub("github-"npu,"github.com")}
 !y{y=sub(/github\.com/,"github-"cpu)}
1' "$ssh_config_path" > temp_ssh_config_path && mv temp_ssh_config_path "$ssh_config_path"

通过这样做,我注意到你的上一个陈述是:

mv temp_ssh_config_path ssh_config_path

当你可能意味着:

mv temp_ssh_config_path "$ssh_config_path"

这会导致您的预期输出文件为空的问题。

当然,整个事情应该只写成一个简单的awk脚本。