17

我知道python -c '<code>',但我想知道是否有更优雅的 python 等效于perl -pi -e '<code>'. perl -pi -e s/foo/bar/g *我仍然将它用于在整个目录(甚至find . | xargs perl -pi -e s/foo/bar/g子目录)中查找和替换之类的事情。

实际上,我觉得 Perl Perl(自由形式的 Tim Toady-ness)是让perl -pi -e工作如此出色的原因,而使用 Python,您必须按照导入 re 模块、创建 re 实例然后捕获标准输入,但也许有一个 Python 快捷方式可以完成所有这些工作,我错过了它(非常想念它)......

4

6 回答 6

10

' ' 中的命令行用法python -h肯定强烈表明没有这样的等价物。Perl 倾向于广泛使用 ' $_' (您的示例隐含使用它),我认为 Python 不支持任何类似的概念,从而使 Perl 单行的 Python 等价物更加困难。

于 2008-12-14T23:53:48.453 回答
10

等价于 -pi 在 Python 中编写起来并不难。

  1. 使用您真正喜欢的 -p 和 -i 功能为自己编写一个方便的模块。让我们称之为pypi.py

  2. 采用python -c 'import pypi; pypi.subs("this","that")'

您可以使用fileinput模块实现基本的 -p 循环。

您将拥有一个函数,subs它实现了打开文件、保存备份副本以及在每一行上进行替换的基本“-i”算法。

有一些像这样的 activestate 食谱。这里有一些:

不是内置的。但不难写。并且一旦编写就易于定制。

于 2008-12-15T00:58:30.693 回答
9

我知道这已经晚了几年,但我最近发现了一个非常好的工具,叫做pyp,它完全可以满足您的要求。

我认为你的命令应该是:

pyp "p.replace('foo','bar')"
于 2013-01-20T21:45:29.777 回答
6

我认为 perl 更适合这种动态脚本。如果您想要快速运行一次性脚本功能,我建议您坚持使用 perl、awk、sed 和标准 unix 命令行工具。

但是如果你对使用 python 感兴趣,我使用optparse编写我自己的命令行工具并推荐它。optparse 提供了一个干净且易于使用的命令行选项解析器,内置帮助生成。

这是一个示例:

def myfunc(filename, use_versbose):
   # function code

if __name__ == '__main__':
    from optparse import OptionParser

    parser = OptionParser()
    parser.add_option("-f", "--file", dest="filename",
                      help="write report to FILE", metavar="FILE")
    parser.add_option("-q", "--quiet",
                      action="store_false", dest="verbose", default=True,
                      help="don't print status messages to stdout")

    (options, args) = parser.parse_args()

    if options.filename:
        myfunc(options.filename, options.verbose)

    else:
        print 'ERROR -- Necessary command line options not given!'
        print parser.print_help()

parser.print_help() 生成以下输出,并在命令行中给出 -h 或 --help 时自动显示:

usage: <yourscript> [options]

options:
  -h, --help            show this help message and exit
  -f FILE, --file=FILE  write report to FILE
  -q, --quiet           don't print status messages to stdout
于 2008-12-15T01:23:27.493 回答
2

fileinput 模块具有就地编辑的能力。但是,您不能免除备份。以下是如何将其用于单线:

python -c 'import fileinput, sys; for line in fileinput.input(inplace=True): sys.stdout.write(line, "foo", "bar")'

就个人而言,当我需要做这样的事情时,我通常只使用 Perl。这是我使用 Perl 的少数几次之一。

于 2012-03-08T01:05:00.130 回答
0

以上可能适用于标准输入,但看起来不适用于文件。

也许是这样的:

--

import fileinput 
import sys
for line in fileinput.input("./poop", inplace=True):
    line = line.replace("foo", "bar")
    sys.stdout.write(line)

-- "./poop" 可以替换为你的文件所在的位置,并且 line.replace 应该支持 line.replace("{}".format(variablehere),"newtext")

于 2014-07-15T13:00:01.920 回答