Python等价于perl-pe?

Python等价于perl-pe?,python,bash,pipe,Python,Bash,Pipe,我需要从一些文本文件中选择一些数字。我可以用grep选择我需要的行,但不知道如何从行中提取数字。一位同事向我展示了如何使用perl从bash执行此操作: cat results.txt | perl -pe 's/.+(\d\.\d+)\.\n/\1 /' 然而,我通常用Python而不是Perl编写代码。所以我的问题是,我可以用同样的方式使用Python吗?也就是说,我是否可以将一些东西从bash传输到Python,然后将结果直接传输到stdout。。。如果这有道理的话。或者Perl在这种情

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

cat results.txt | perl -pe 's/.+(\d\.\d+)\.\n/\1 /'
然而,我通常用Python而不是Perl编写代码。所以我的问题是,我可以用同样的方式使用Python吗?也就是说,我是否可以将一些东西从bash传输到Python,然后将结果直接传输到stdout。。。如果这有道理的话。或者Perl在这种情况下更方便吗?

您可以使用:

$ python -c '<your code here>'

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

python -c "import sys; print sys.path"
对于Perl来说,没有一个与-p选项直接等价的自动逐行输入/输出处理,但这主要是因为Python没有使用Perl所使用的$和其他概念——在Python中,所有输入和输出都是通过原始输入/输入和打印/打印手动完成的

对于您的特定示例:

cat results.txt | python -c "import re, sys; print ''.join(re.sub(r'.+(\d\.\d+)\.\n', r'\1 ', line) for line in sys.stdin)"

显然有些笨拙。最好是用实际的Python编写脚本。

您可以使用Python直接从bash命令行执行代码,方法是使用Python-c,或者您可以使用sys.stdin处理通过管道传输到stdin的输入,请参见。

理论上可以,但Python没有Perl那么多的正则表达式魔力,因此,生成的命令将更加笨拙,特别是在不导入re就无法使用正则表达式的情况下,并且可能还需要sys for sys.stdin

与同事的Perl one liner相当的Python大约是:

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

你有一个问题可以用几种方法解决

我认为您应该考虑使用Perl直接从Python中执行Perl的正则表达式。正则表达式位于re模块中。例如:

import re
filecontent = open('somefile.txt').read()
print re.findall('.+(\d\.\d+)\.$', filecontent)
我更喜欢使用$而不是'\n'作为行尾,因为在操作系统和文件编码之间行尾是不同的

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

import os
os.system(mycommand)
其中command是bash命令。我一直在使用它,因为在bash中执行某些操作比在Python中更好


最后,如果您想用grep提取数字,请使用-o选项,它只打印匹配的部分。

Perl或sed更方便。但是,如果不美观,也有可能:

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

您可以重新考虑,用python进行所有解析。从python进行greping将是非常容易的。如果您遇到问题,只需发布另一个问题,说明如何在python中解析这些行,5分钟后您将获得code@TJD:是的。我考虑一下。在考虑了一些答案和方法之后,我问:如果你只使用GRP-O,它是否能工作,它只打印线的匹配部分?@ HeltBikk:我不确定在我的情况下,因为各种原因会起作用,但是另一次它当然值得考虑。谢谢:和往常一样,这是对猫的无用利用。请查看和/或将其改写为perl-pe的s/+\d\.\d+\.\n/\1/'结果。txt感谢您和@Amber的快速回复!这几乎就是我想要的,但不完全是。这类似于perl-e,但它不会将输出打印到标准输出。因此python-C2+2没有给出任何结果。您可以使用python-c'a=2+2;打印一个“当然,但你明白我的意思吗?@Nagel:所有的答案都是关于某个命令行方法的,但是你使用的是脚本吗?对于读取大量文件,我肯定会使用脚本。奇怪的是,我使用的Python版本2.7.1似乎不喜欢分号后的内联for循环-简单的命令可以工作,但更复杂的结构会抛出语法错误。@Dashwuff-这是意料之中的。分号无法指定块。您可以改为使用理解/生成器表达式。导入标准模块不应被视为不纯或不太健壮的代码,至少在Python中不应如此。谢谢!我也这么怀疑。我想我会为这类任务学习一些基本的perl:@heltonbiker当然有其道理,但是生成的python代码更长,并且作为命令行工具使用似乎有点笨拙。