创建包含反斜杠的字符串供sed使用

2024-09-30 20:21:48 发布

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

我正在用python创建一个命令字符串,它需要使用pexpect在主机上执行。我希望在主机上运行的sed命令如下:

sed -i 's/\(panic=30\)/\1 my_cool_option/g' /boot/bootrc

如何在python中创建一个保留反斜杠的变量?起初,我试过了

^{pr2}$

当我在python shell中检查上述代码时,它看起来很正常:

>>> bootrc = '/boot/bootrc'
>>> param = 'ignorefs'
>>> cmd = "sed -i 's/\(panic=30\)/\\1 {}/g' {}".format(param, bootrc)
>>> print cmd
sed -i 's/\(panic=30\)/\1 ignorefs/g' /boot/bootrc

但是,当我通过pdb了解代码失败的原因时,cmd被设置为

(Pdb) p cmd
"sed -i 's/\\(panic=30\\)/\\1 ignorefs/g' /boot/bootrc"

我不知道如何生成正确的字符串来执行sed命令。在

谢谢


Tags: 字符串代码命令cmdparammysedpexpect
2条回答

我知道你的问题已经得到了回答,但是为了将来的参考,如果你有一个带反斜杠的字符串,并且你想确定它包含你认为应该包含的内容,你可以逐字符扫描并打印它,例如

#! /usr/bin/env python

mystring = "this\nis\t a \complicated\\string"
print repr(mystring), len(mystring)
for i,v in enumerate(mystring):
    print "%2d: %-4r %02x" % (i, v, ord(v))

输出

^{pr2}$

这让我在第一次读到你的问题时感到困惑,但是请看一下string literals

您可能知道,python使用反斜杠字符\作为转义符。因此,要在字符串文本中包含新行,我们键入

s = 'hello\nworld'

如果我们想要一个真正的反斜杠,我们使用双反斜杠

^{pr2}$

如果反斜杠后面的字符与转义序列不匹配,则反斜杠保持原样

s = '\ ' # space doesn't match any escape sequence, so you get to keep the backslash

这就是你的\(所发生的事情——你最终得到了<backslash><open parnes>

但是\1与转义序列匹配,它是字符的八进制表示的文本。所以不是<backslash>1,而是<0x01>。在

当您在pdb中使用p cmd时,它正在打印字符串的repr,这恰好对不可打印的字符使用了反斜杠转义。这与在pythonshell中使用print cmd不同。在

python shell:
>>> print '\\'
\

pdb:
(Pdb) p '\\'
'\\'

Pdb显示你只有一个反斜杠。类似于

>>> print repr('\\')
'\\'

所以当你说

(Pdb) p cmd
"sed -i 's/\\(panic=30\\)/\\1 ignorefs/g' /boot/bootrc"

所有的双反斜杠对都是单反斜杠字符。与注释中工作示例的不同之处在于,在打开/关闭parens前面有文本反斜杠。在

最后,如果不想担心反斜杠转义,可以使用原始字符串

>>> s = r"sed -i 's/\(panic=30\)/\1 my_cool_option/g' /boot/bootrc"
>>> print s
sed -i 's/\(panic=30\)/\1 my_cool_option/g' /boot/bootrc
>>> print repr(s)
"sed -i 's/\\(panic=30\\)/\\1 my_cool_option/g' /boot/bootrc"

相关问题 更多 >