繁体   English   中英

有没有相当于`perl -pi -e`的Python?

[英]Is there a Python equivalent to `perl -pi -e`?

我知道python -c '<code>' ,但我想知道是否有更优雅的python等同于perl -pi -e '<code>' 我仍然在整个目录中找到和替换相当多的东西( perl -pi -es/foo/bar/g *甚至find . | xargs perl -pi -es/foo/bar/g for sub-目录)。

我实际上觉得Perl Perl(自由形式Tim Toady-ness)使perl -pi -e工作得如此之好,而使用Python你必须做一些导入re模块的工作,创建一个重新实例,然后捕获标准输入,但也许有一个Python快捷方式,所有这一切,我错过了它(非常想念它)...

Python适用于麻瓜。 如果你想要魔法,你应该使用Perl!

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

等效于-pi并不难用Python编写。

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

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

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

你有一个函数, subs实现了打开文件,保存备份副本和在每一行上替换的基本“-i”算法。

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

不是内置的。 但写起来并不难。 而且一旦写好易于定制。

我知道这已经太晚了几年,但我最近发现了一个非常好的工具叫做pyp ,它正是你所要求的。

我认为你的命令应该是:

pyp "p.replace('foo','bar')"

我认为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

fileinput模块具有就地编辑功能。 但是,您无法免除备份。 以下是如何将它用于单线程:

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

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

上面的内容可能适用于stdin,但看起来不适用于文件。

也许是这样的:

-

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”)等内容

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM