簡體   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