如何使用python中的sed命令在文件中添加页眉

1 人关注

我想用python的sed命令在文件的开头添加下面一行。

ID|SEC_NO|SEC_CD|SEC_DATE|SEC_ID1|SEC_DESC1|SEC_ID2|SEC_DESC2|SEC_ID3|SEC_DESC3
Command: sed -i '1i ID|SEC_NO|SEC_CD|SEC_DATE|SEC_ID1|SEC_DESC1|SEC_ID2|SEC_DESC2|SEC_ID3|SEC_DESC3' file.csv

上述命令在bash中运行良好。但是当我试图从Python中运行同样的命令时,我得到了错误。

cmd =["sed", "-i", "'1i ID|SEC_NO|SEC_CD|SEC_DATE|SEC_ID1|SEC_DESC1|SEC_ID2|SEC_DESC2|SEC_ID3|SEC_DESC3'", "file.csv"]

我得到了这个错误信息

"sed: -e expression #1, char 1:unkown command: `''\n"
    
python
linux
sed
user8592197
user8592197
发布于 2021-07-22
2 个回答
blhsing
blhsing
发布于 2021-07-22
已采纳
0 人赞同

单引号 ( ' s) 被 shell 解释为将所包围的字符序列作为命令的一个参数。当你在Python中用 subprocess.run 将一个命令和它的参数作为一个列表运行时,每个列表项都会作为一个参数传递给命令,所以你不应该用单引号来包围任何参数。

cmd = ["sed", "-i", "1i ID|SEC_NO|SEC_CD|SEC_DATE|SEC_ID1|SEC_DESC1|SEC_ID2|SEC_DESC2|SEC_ID3|SEC_DESC3", "file.csv"]

否则单引号本身就是参数的一部分,在你的例子中,它被sed所解释。

czeni
czeni
发布于 2021-07-22
0 人赞同

你应该试试 shlex lib,在python中分割你的bash命令。

$ cat test.txt
$ python3
Python 3.8.10 (default, Jun  2 2021, 10:49:15) 
[GCC 9.4.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import subprocess, shlex
>>> subprocess.run(shlex.split("sed -i '1i ID|SEC_NO|SEC_CD|SEC_DATE|SEC_ID1|SEC_DESC1|SEC_ID2|SEC_DESC2|SEC_ID3|SEC_DESC3' test.txt"))
CompletedProcess(args=['sed', '-i', '1i ID|SEC_NO|SEC_CD|SEC_DATE|SEC_ID1|SEC_DESC1|SEC_ID2|SEC_DESC2|SEC_ID3|SEC_DESC3', 'test.txt'], returncode=0)