【问题标题】:Call sed via subprocess通过子进程调用 sed
【发布时间】:2015-04-26 02:36:24
【问题描述】:

我需要通过 Python 调用 Sed。我尝试了this问题的答案,但它不起作用。

我的代码是(是的,该文件没有扩展名,它在使用 putty 时有效):

filename = '/home/user1/file'
subprocess.call(["sed","-i",r"$'s/[][]//g;s/,/\\\n/g'",filename])

有人可以看看出了什么问题吗?脚本执行,但只是跳过子进程调用。


好的,所以我使用 Python re 模块进行了尝试,这是我的代码:

filename = '/home/user/file'
filenametemp = '/home/user/temp'
file = open(filename, "r")
temp = open(filenametemp,"w+")
text = file.read()

text = re.sub(r'\[|\]',r'',text)
text = re.sub(r',',r'\n', text)
print text

temp.write(text)

header_row=['H1','H2','H3'] 
data = pd.read_csv(filenametemp, sep= ';',skipinitialspace=1, names=header_row)

文件“temp”现在的布局正确,但 Pandas 在打开此文件时会创建一个空数据框。 但是,如果我注释掉:

 #temp = open(filenametemp,"w+")
 #temp.write(text)

然后再次运行脚本,所有数据都已正确加载到数据框中。

有人可以解释为什么会发生这种情况并有解决方案吗?


原来我必须先关闭文件才能使用它。因此,虽然它不是通过对 sed 的子进程调用完成的,但它返回了正确的解决方案:

filename = '/home/user/file'
filenametemp = '/home/user/temp'
file = open(filename, "r")
temp = open(filenametemp,"w+")
text = file.read()

text = re.sub(r'\[|\]',r'',text)
text = re.sub(r',',r'\n', text)
print text

temp.write(text)
temp.close()

header_row=['H1','H2','H3'] 
data = pd.read_csv(filenametemp, sep= ';',skipinitialspace=1, names=header_row)

【问题讨论】:

  • 您是否错过了以这种方式运行时不需要单引号的一点,因为您没有使用外壳?如果您需要将转义序列转换为文字字符(并且您可能不需要),那么我认为如果您不将它们从 python 中转义,则不使用原始字符串将为您做到这一点。
  • “只是跳过子进程调用” - 不要做出疯狂的假设。显然情况并非如此。
  • 只是一个想法,但是当你有 Python 时为什么要使用sed
  • 我使用 sed 是因为我有一个可行的解决方案。如果您在 Python 中有其他解决方案,我也想尝试一下。但是下面 Rob 提到了 re 模块,但从文档中我无法找到它是如何工作的。
  • 请不要编辑问题来提供答案。相反,发布您自己的答案(如果您愿意,可以接受它;这样,您的问题将不再被视为未解决)。

标签: python sed


【解决方案1】:

1) “我需要通过 Python 调用 Sed”。我不认为你真的需要那个。一个 Python 程序,使用re 模块,可以做sed 可以做的所有事情,甚至更多。

2)“脚本执行,但只是跳过了子进程调用。”我也不认为这是准确的。 subprocess.call 实际上调用,sed 运行,但sed 命令中的语法错误阻止sed 完成其职责似乎更有可能。

3) 您的字符串中有几个额外的字符。它不需要$',或者很多\。试试这个:

import subprocess
filename = '/tmp/file'
subprocess.call(["sed","-i",r"s/[][]//g;s/,/\n/g",filename])

这里是/tmp/file之前:

Hello[] This Is[] A Test, this is just a test, you[] know?

之后:

Hello This Is A Test
 this is just a test
 you know?

【讨论】:

  • 您好 Rob 我尝试了您的解决方案,但是它也不会更改文件的任何内容。和之前一样。至于第 1 点,我不需要在 Sed 中执行此操作,但我查看了 re 模块,但我从文档中无法了解它是如何工作的。
猜你喜欢
  • 2011-10-06
  • 2019-03-05
  • 2014-10-20
  • 1970-01-01
  • 1970-01-01
  • 2023-03-26
  • 1970-01-01
  • 2013-09-19
  • 1970-01-01
相关资源
最近更新 更多