我目前正在尝试执行以下操作:
cmd = r'sudo sed -irn "1!N; s/<ip>127.0.0.1<\/ip>(\n.*4000.*)/<ip>0.0.0.0<\/ip>\1/" /usr/something.conf'
subprocess.Popen(cmd)
然而,\\Popen是无效的引用。在pdb检查后我看到了这个
^{pr2}$似乎python正在添加一个额外的\
。有什么方法可以防止这种情况,这样我就可以像使用Popen一样运行命令了吗?在
另外,为了简化起见,我把它排除在示例之外,但实际上这是在传递给Popen之前包装在SSH调用中的,所以是的。。。它确实需要使用Popen
和sed
来完成。在
作为参考,这里是字符串运行所经过的全部步骤链。。。在
^{3}$返回确切的错误消息:
sed: -e expression #1, char 59: invalid reference \\1 on `s' command's RHS
问题是shell正在进行自己的解释/转义。我在使用cygwin时发现了类似的情况(在cygwin中,shell是bash)。在
你得到错误的事实是:
意味着问题出在方括号}的转义。实际上,它无法找到组,因此需要转义方括号
()
,而不是{\(...\)
。在要找到原因,诀窍是使用
echo
调试正在发送的内容:将正则表达式简化为一个组和匹配项。比如:
^{pr2}$其中输入字符串为“one”,预期输出为
oneone
将您的
cmd
更改为echo
,这样传递给shell的是echo s/(one)/\1\1/
我猜你会看到类似
bash: syntax error near unexpected token '('
的东西。这给了我们线索。基本上,我们需要避开括号。所以现在试试
echo s/\(one\)/\1\1
。在我的情况下,我看到了如果你运气好的话,你应该可以把它应用到你有问题的表达上。
使用strong quoting(用单引号括起来的命令)可能是最简单的方法,它告诉bash不要解释字符串,尽管您可能仍然需要转义方括号
()
。在顺便说一句,对于cygwin来说,事情需要两次转义,所以实际正确的表达式是:
所以
给予
使用强引用的等效方法是:
相关问题 更多 >
编程相关推荐