Python相当于perl -pe?

时间:2011-10-20 22:15:26

标签: python bash pipe

我需要从一些文本文件中选择一些数字。我可以用grep挑选出我需要的行,但不知道如何从行中提取数字。一位同事告诉我如何使用perl从bash执行此操作:

cat results.txt | perl -pe 's/.+(\d\.\d+)\.\n/\1 /'

但是,我通常用Python编写代码,而不是Perl代码。所以我的问题是,我可以用同样的方式使用Python吗?即,我可以将bash中的内容传递给Python,然后将结果直接输入到stdout吗? ......如果这是有道理的。或者Perl在这种情况下更方便吗?

7 个答案:

答案 0 :(得分:11)

是的,您可以从命令行使用Python。 python -c <stuff>将作为Python代码运行<stuff>。例如:

python -c "import sys; print sys.path"

没有直接等同于Perl的-p选项(自动输入/输出逐行处理),但这主要是因为Python不使用{{1的相同概念而Perl所做的一切 - 在Python中,所有输入和输出都是手动完成的(通过$_ / raw_input()input() / print)。


对于您的特定示例:

print()

(显然有点笨拙。在实际的Python中编写脚本可能会更好。)

答案 1 :(得分:2)

您可以使用:

$ python -c '<your code here>'

答案 2 :(得分:1)

理论上你可以,但是Python并没有像Perl那么多的正则表达式魔法,所以生成的命令会更加笨拙,特别是因为你不能在不导入re的情况下使用正则表达式(而且sys也可能需要sys.stdin

你的同事的Perl单线程的Python等价物是:

import sys, re
for line in sys.stdin:
    print re.sub(r'.+(\d\.\d+)\.\n', r'\1 ', line)

答案 3 :(得分:1)

你有一个问题可以通过多种方式解决。

我认为您应该考虑直接从Python使用正则表达式(perl在您的示例中执行的操作)。正则表达式位于re模块中。一个例子是:

import re
filecontent = open('somefile.txt').read()
print re.findall('.+(\d\.\d+)\.$', filecontent)

(我更倾向于使用$而不是'\ n'来表示行结尾,因为操作系统和文件编码之间的行结尾不同)

如果要从Python内部调用bash命令,可以使用:

import os
os.system(mycommand)

where命令是bash命令。我一直都在使用它,因为在bash中执行某些操作比在Python中执行更好。

最后,如果要使用grep提取数字,请使用-o选项,该选项仅打印匹配的部分。

答案 4 :(得分:0)

您可以使用python直接从bash命令行执行代码,使用python -c,或者您可以使用sys.stdin处理通过管道输入到标准输入的输入,请参阅here

答案 5 :(得分:0)

Perl(或sed)更方便。但是,如果丑陋的话,这是可能的:

python -c 'import sys, re; print "\n".join(re.sub(".+(\d\.\d+)\.\n","\1 ", l) for l in sys.stdin)'

答案 6 :(得分:0)

引用自https://stackoverflow.com/a/12259852/411282

for ln in __import__("fileinput").input(): print ln.rstrip()

请参阅上面链接的解释,但这与 perl -p 的作用相比要多得多,包括支持多个文件名和 stdin(当未提供文件名时)。

https://docs.python.org/3/library/fileinput.html#fileinput.input