使用 python 中的 sed 替换字符串和更新文件

Posted

技术标签:

【中文标题】使用 python 中的 sed 替换字符串和更新文件【英文标题】:Replace strings and update file using sed from python 【发布时间】:2022-01-17 04:25:58 【问题描述】:

我试图替换带有双引号的文件的第一行。 该文件包含如下内容:

"A"|"B"|"C"
"1"|"2"|"3"

我想创建或更新文件以显示如下内容(第一行不带双引号):

A|B|C
"1"|"2"|"3"

这通常可以使用 bash 和 sed 来完成:

sed 's/"A"|"B"|"C"/A|B|C/g' inputfile.txt> outputfile.txt

我想使用 subprocess.call() 从 python 实现它

我的代码:

subprocess.call(["sed", 's/"A"|"B"|"C"/A|B|C/g', "inputfile.txt", ">", "outputfile.txt"])

但是它会抛出一个错误:

sed: can't read >: No such file or directory
sed: can't read outputfile.txt: No such file or directory

我想我必须先创建文件 outputfile.txt,但我想从 python 中完成这一切。 你能帮我吗,提前谢谢。

【问题讨论】:

你为什么要从python 中调用sed?为什么不使用python自己的字符串操作方法? 当参数是列表时不能使用>。这是一个 shell 功能,所以你必须使用带有shell=True 的字符串。 @match 我知道该怎么做.. 但我想要这个特定的方法。谢谢 subprocess.call(["sed 's/"A"|"B"|"C"/A|B|C/g' inputfile.txt> outputfile.txt"], shell=True) @Barmar 我用了这个方法..但由于某种原因不起作用,可能与双引号和单引号混淆 内部双引号需要转义。 【参考方案1】:

要使用> 重定向,您需要使用shell=True 和单个字符串参数,而不是列表。

subprocess.call("""sed 's/"A"|"B"|"C"/A|B|C/g' inputfile.txt > outputfile.txt""", shell=True)

【讨论】:

非常感谢...当我尝试这种方法时,我错过了引号。最好的问候。 你还有额外的[]

以上是关于使用 python 中的 sed 替换字符串和更新文件的主要内容,如果未能解决你的问题,请参考以下文章

python 实现类似sed命令的文件内容替换

替换python脚本中的字符串并执行脚本

使用grep和sed递归查找和替换所有文件中的字符串[重复]

替换文件中的第 N 个字符串匹配项

Linux批量替换多个文件中字符串

如何用sed命令替换一行中的某个字符串