【问题标题】:subprocess call of sed command giving errorsed 命令的子进程调用给出错误
【发布时间】:2014-10-20 18:31:07
【问题描述】:

我有一个包含以下行的文本文件

PIXEL_SCALE      1.0            # size of pixel in arc

要将其中的 1.0 替换为 0.3, 我尝试通过 python 脚本中的 subprocess.call 使用 sed。 以下 sed 正则表达式命令在 shell 中完美运行。

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")。但他们没有任何效果。 这里可能出了什么问题?

谢谢

【问题讨论】:

  • 尝试 subprocess.Popen("sed -i 's/^(PIXEL_SCALE\s*)([0-9]*\.[0-9]*)/\10.3/' 文件名。 txt",shell=True")

标签: python regex sed subprocess


【解决方案1】:
subprocess.call("sed -i 's/^\(PIXEL_SCALE\s*\)\([0-9]*\.[0-9]*\)/\10.3/' filename.txt", shell=True)

有效

【讨论】:

  • 谢谢。但为了使它工作,我还必须在字符串后缀 r 以防止 python 转义其中的 \s。
  • 添加 shell=True 通过在您和您的数据之间添加另一个进程来修复它。更好的解决方法是了解正在发生的事情,并将外壳从复杂的事情中移除。更好的解决方法仍然是在 Python 本身中执行这个简单的替换,它已经为这项任务做好了准备。
【解决方案2】:

' 引号是 shell 使用的分隔符。由于您不使用外壳,因此您不需要在正则表达式周围使用它们:

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

此外,我使用了raw string (r"....") 来防止 python 解释反斜杠转义序列。

【讨论】:

  • 谢谢。那行得通。我曾尝试删除引号以及单独添加 r 。但没有同时尝试。谢谢。
【解决方案3】:
's/(PIXEL_SCALE\s*)[0-9]+[0-9]+/\10.3/'

【讨论】:

  • 你能在你的anwser中包含单词吗?这可能会更清楚。
猜你喜欢
  • 1970-01-01
  • 2021-07-28
  • 2015-08-02
  • 1970-01-01
  • 2023-03-30
  • 1970-01-01
  • 1970-01-01
  • 2013-04-27
  • 1970-01-01
相关资源
最近更新 更多