这里有一个情况,我试图在shell脚本中的远程shell上运行sed命令,并使用动态的变量,最终一次又一次地得到相同的错误。
这是sed命令,它在本地shell上运行良好,没有任何错误。经过彻底的测试后,我使用了这个正则表达式,相信我,它没有问题。
sed -i 's/ #0\t30718/ 0\t30718/' ./config.txt试图使用ssh在远程shell中运行此操作:
ssh root@sys_name sed -i 's/ #0\t30718/ 0\t30718/' /absolute-path/vconfig.txt当我试图使用变量运行这个命令时。(30718和文件的路径是变量):
ssh root@sys_name 'sed -i "s/0\t${pe_list[0]}/#0\t${pe_list[0]}/g" $file_path'或者像这样:
ssh root@sys_name "sed -i 's/0\t${pe_list[0]}/#0\t${pe_list[0]}/g' $file_path"我要么得到sed:-e表达式#1,char 2: un终止的命令错误,要么使用与变量名匹配的不想要的输出执行sed命令。基本上,简单地说,我想使用ssh在远程shell上执行sed命令,约束是整个命令是脚本的一部分,要匹配的值和文件名是该文件中的变量。
发布于 2018-10-30 06:20:46
在本地shell中有变量集,但不是sed变量,因此您应该退出sed环境,使用单引号关闭它,放置变量,然后用单引号重新打开,然后继续使用sed:
sed -e 's/Red Hat/'${z}'/' /etc/redhat-release如果$z变量包含空格,则需要使用双引号:
sed -e 's/Red Hat/'"${z}"'/' /etc/redhat-release最后,当您通过ssh发送命令时,您还将在整个命令周围添加双引号,因此应该对此命令中使用的所有双引号进行转义,否则在源主机上将在本地计算它们之间的所有内容。所以要这样做:
z="BLACK HAT"
ssh root@sys_name "sed -e 's/Red Hat/'\"${z}\"'/' /etc/redhat-release"你会得到:
BLACK HAT Enterprise Linux Server release 6.10 (Santiago)https://stackoverflow.com/questions/53058136
复制相似问题