subprocess调用sed命令出错

0 投票
3 回答
1685 浏览
提问于 2025-04-18 18:41

我有一个文本文件,里面有这么一行:

PIXEL_SCALE      1.0            # size of pixel in arc

我想把里面的1.0替换成0.3,

于是我尝试通过Python脚本里的subprocess.call来使用sed命令。

在命令行中,下面这个sed的正则命令运行得很好。

sed -i 's/^\(PIXEL_SCALE\s*\)\([0-9]*\.[0-9]*\)/\10.3/' filename.txt

但是,等效的subprocess.call命令却给我报了一个错误。

subprocess.call(['sed','-i',"'s/^\(PIXEL_SCALE\s*\)\([0-9]*\.[0-9]*\)/\10.3/'",'filename.txt'])

sed: -e expression #1, char 1: unknown command: `''

我尝试通过在字符串前加r来把它转换成原始字符串,还尝试了使用.encode("UTF-8")。但是这些都没有效果。

这可能出什么问题呢?

谢谢

3 个回答

0

在编程中,有时候我们会遇到一些问题,比如代码运行不正常或者出现错误。这种情况下,我们需要找到问题的根源。通常,我们可以通过查看错误信息来帮助我们理解发生了什么。

错误信息就像是程序在告诉我们:“嘿,我在这里遇到了麻烦!”它们通常会指明出错的地方和原因。理解这些信息可以帮助我们快速定位问题,进而修复代码。

另外,很多时候我们可以在网上找到类似的问题和解决方案,比如在StackOverflow这样的社区。这里有很多经验丰富的程序员分享他们的经验和解决方法,能帮助我们更好地理解和解决问题。

总之,遇到问题时,不要慌张,仔细阅读错误信息,并尝试在网上寻找帮助,这样你会逐渐变得更有经验。

's/(PIXEL_SCALE\s*)[0-9]+[0-9]+/\10.3/'
0
subprocess.call("sed -i 's/^\(PIXEL_SCALE\s*\)\([0-9]*\.[0-9]*\)/\10.3/' filename.txt", shell=True)

这可以工作

3

单引号(')是命令行中用来分隔内容的符号。因为你不在使用命令行,所以在你的正则表达式周围不需要加上这些符号:

subprocess.call(['sed','-i',r"s/^\(PIXEL_SCALE\s*\)\([0-9]*\.[0-9]*\)/\10.3/",'filename.txt'])
#                           ^^                                                             ^

另外,我使用了一个叫做 原始字符串 的东西(r"...."),这样可以防止 Python 误解反斜杠后面的内容。

撰写回答