在bash脚本中使用vim来替换字符

时间:2015-09-11 13:02:02

标签: macos bash vim

我想构建一个小的util脚本来替换给定文件中的字符。这是我到目前为止所拥有的。当我运行它时,我会看到我的回音消息,但程序永远不会返回。如果我手动退出程序,则无效。所以它似乎悬挂在某个地方,但我无法确定原因。

sEnv=$1
eEnv=$2
reverseArgs=$3
echo ${reverseArgs}
if [ "$3" == "-r" ]; then
   echo "changing from ${eEnv} to ${sEnv}"
   cmd="vim -E -s /Users/X/nginx.conf << EOF\
   :%s/${eEnv}/${sEnv}/g\
   :wq\
   EOF"
   `${cmd}`
else
   echo "changing from ${sEnv} to ${eEnv}"
   cmd="vim -E -s /Users/X/nginx.conf << EOF\
   :%s/${sEnv}/${eEnv}/g\
   :wq\
   EOF"
   `${cmd}`
fi
EOF

我知道它应该有用,因为如果我把它放在我的脚本中就可以了:

vim -E -s /Users/X/nginx.conf << EOF
   :%s/${eEnv}/${sEnv}/g
   :wq
   EOF

2 个答案:

答案 0 :(得分:3)

正如@trojanfoe首先建议的那样,你应该使用sed来完成这样的工作。它更适合:

sed -i "s/${eEnv}/${sEnv}/g" ${file}

但是可以使用vim进行此操作。您尝试不起作用的原因是您正在构建命令以字符串形式执行,并且这样做会将您的heredoc压缩为普通字符串。当你可以直接执行命令时,我不明白为什么这很有用:

vim -E -s /Users/philippeguay/nginx.conf << EOF
:%s/${sEnv}/${eEnv}/g
:wq
EOF

答案 1 :(得分:2)

不确定为什么要通过变量cmd。尝试:

sEnv=$1
eEnv=$2
reverseArgs=$3
echo ${reverseArgs}
if [ "$3" == "-r" ]; then
   echo "changing from ${eEnv} to ${sEnv}"
   vim -E -s - /Users/X/nginx.conf <<EOF
   :%s/${eEnv}/${sEnv}/g
   :wq
EOF
else
   echo "changing from ${sEnv} to ${eEnv}"
   vim -E -s - /Users/philippeguay/nginx.conf <<EOF
   :%s/${sEnv}/${eEnv}/g
   :wq
EOF
fi

我为我的vim添加了-s -,我认为它将文件名作为脚本。 请注意,EOF不得缩进。