2017-04-13 46 views
0

我想把这个sed命令删除一个儿子文件中的最后一个逗号。Sed一个班轮不能在蟒蛇子过程中工作

sed -i -e '1h;1!H;$!d;${s/.*//;x};s/\(.*\),/\1 /' file.json" 

当我在命令行中运行它,它工作正常。当我尝试作为一个子进程运行,因此它不起作用。

Popen("sed -e '1h;1!H;$!d;${s/.*//;x};s/\(.*\),/\1 /' file.json",shell=True).wait() 

我在做什么错?

+0

你试过' check_call([“sed”,“ - e”,r“1h; 1!H; $!d; $ {s /.*//; x}; s/\(。* \),/ \ 1/,“file.json”])'?为什么不直接使用python呢?这很简单,你知道。 –

+0

为什么从sed中删除选项'-i'? – Cyrus

+0

,因为我滑/编辑错误。我把它放回到我的答案中。 –

回答

0

它不起作用,因为当你编写\1时,python会将其解释为\x01而我们的正则表达式不起作用/是非法的。

这已经是好:

check_call(["sed","-i","-e",r"1h;1!H;$!d;${s/.*//;x};s/\(.*\),/\1 /","file.json"]) 

因为分割作为一个真正的列表,并通过你的正则表达式为原料串有更好的机会来工作。并且check_call是您只需调用一个进程而不关心其输出的程序。

我会做的更好:由于蟒蛇是善于处理文件,给您相当简单的问题,我会创建一个完全便携版本,无需sed

# read the file 
with open("file.json") as f: 
    contents = f.read().rstrip().rstrip(",") # strip last newline/space then strip last comma 
# write back the file 
with open("file.json","w") as f: 
    f.write(contents) 
+0

谢谢!在其他子流程的上游,我还有其他几个sed和awk命令,所以我只写了一行,以使它们全部一致。 checkcall工作。 – Ahk86

+0

好的,所以你可以接受答案:) –

+0

祝你好运,接受你的答案。 OP只接受一次答案。 – alvits