我在远程服务器上有一个文件,需要在其中更新一行。我试图通过python进行更新,但似乎存在字符转义问题。
我要更新的文件中的行是:
BEGRCVDDATE=02/01/2018 00:00 am我用来尝试更新的python脚本中的代码行:
os.popen('ssh %s sed -i s/'BEGRCVDDATE=[0-9][0-9]\/[0-9][0-9]\/[0-9][0-9][0-9][0-9] [0-9][0-9]:[0-9][0-9] [a-z][a-z]'/'BEGRCVDDATE=%s'/ %s' % (ip, rcvdate, file_path))上面的代码引发了以下错误:
sed: -e expression #1, char 37: unknown option to `s'然而,我能够在python脚本之外运行sed命令,这使我相信这是一个字符转义问题。下面在python脚本之外工作。
ssh <ip> "sed -i s/'BEGRCVDDATE=[0-9][0-9]\/[0-9][0-9]\/[0-9][0-9][0-9][0-9] [0-9][0-9]:[0-9][0-9] [a-z][a-z]'/'BEGRCVDDATE=BEGRCVDDATE=03\\/08\\/2018 00:00 pm'/ /tmp/test.txt"我尝试了各种组合的引号和反斜杠,试图绕过我看到的问题,但没有成功。
如果有人能帮我解决这个问题,我会非常感激的。
注意:由于我的环境中的python版本,os.popen正在使用而不是子进程。
发布于 2018-03-08 21:11:13
import subprocess, pipes
# Generate your list of arguments *as a list of Python strings*
rcvdate = '02/01/2018 00:00 am'
cmd=['sed', '-i',
's@BEGRCVDDATE=[0-9][0-9]/[0-9][0-9]/[0-9][0-9][0-9][0-9] [0-9][0-9]:[0-9][0-9] [a-z][a-z]@BEGRCVDDATE=%s@' % (rcvdate,),
file_path,
]
# Ask Python itself to correctly form a shell command from that list
cmd_str = ' '.join([pipes.quote(s) for s in cmd])
# Pass that shell command as an argument to `ssh`.
subprocess.call(['ssh', ip, cmd_str])...or,如果您真的没有subprocess模块,那么需要进行第二轮外壳转义:
ssh_cmd = ['ssh', ip, cmd_str]
ssh_cmd_str = ' '.join([pipes.quote(s) for s in ssh_cmd])
os.system(ssh_cmd_str)请注意,我将您的sed表达式更改为使用@而不是/作为信号。这意味着不再需要文字反斜杠。
https://stackoverflow.com/questions/49182304
复制相似问题