双倍逃生通道

2024-09-30 01:34:02 发布

您现在位置:Python中文网/ 问答频道 /正文

我目前正在尝试执行以下操作:

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调用中的,所以是的。。。它确实需要使用Popensed来完成。在

作为参考,这里是字符串运行所经过的全部步骤链。。。在

^{3}$

返回确切的错误消息:

sed: -e expression #1, char 59: invalid reference \\1 on `s' command's RHS

Tags: 方法命令ipcmdusrconfsudo情况
1条回答
网友
1楼 · 发布于 2024-09-30 01:34:02

问题是shell正在进行自己的解释/转义。我在使用cygwin时发现了类似的情况(在cygwin中,shell是bash)。在

你得到错误的事实是:

sed: -e expression #1, char 59: invalid reference \\1 on `s' command's RHS

意味着问题出在方括号(),而不是{}的转义。实际上,它无法找到组,因此需要转义方括号\(...\)。在

要找到原因,诀窍是使用echo调试正在发送的内容:

  1. 将正则表达式简化为一个组和匹配项。比如:

    ^{pr2}$

    其中输入字符串为“one”,预期输出为oneone

  2. 将您的cmd更改为echo,这样传递给shell的是echo s/(one)/\1\1/

  3. 我猜你会看到类似bash: syntax error near unexpected token '('的东西。这给了我们线索。基本上,我们需要避开括号。

  4. 所以现在试试echo s/\(one\)/\1\1。在我的情况下,我看到了

    s/(one)/\1\1
    
  5. 如果你运气好的话,你应该可以把它应用到你有问题的表达上。

使用strong quoting(用单引号括起来的命令)可能是最简单的方法,它告诉bash不要解释字符串,尽管您可能仍然需要转义方括号()。在

顺便说一句,对于cygwin来说,事情需要两次转义,所以实际正确的表达式是:

sed s/\\\(one\\\)/\\1\\1/

所以

echo one | sed s/\\\(one\\\)/\\1\\1/

给予

oneone

使用强引用的等效方法是:

 echo one | sed 's/\(one\)/\1\1/'

相关问题 更多 >

    热门问题