[英]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編寫。
使用您真正喜歡的-p和-i功能為自己編寫一個方便的模塊。 我們稱之為pypi.py
使用python -c 'import pypi; pypi.subs("this","that")'
python -c 'import pypi; pypi.subs("this","that")'
您可以使用fileinput模塊實現基本的-p循環。
你有一個函數, subs
實現了打開文件,保存備份副本和在每一行上替換的基本“-i”算法。
有一些像這樣的activestate食譜。 這里有一些:
不是內置的。 但寫起來並不難。 而且一旦寫好易於定制。
我認為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.