2008-12-14 88 views
15

我知道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 -pi -e`的Python?

我真的覺得Perl Perl(自由形式Tim Toady-ness)的作用就是讓perl -pi -e工作得很好,而在Python中,你必須沿着導入re模塊的方向做一些事情,創建一個然後捕獲標準輸入,但也許有一個Python快捷方式,所有這一切,我錯過了它(很想念它)...

+2

坦率地說,這聽起來像Guido不會贊同的。 – Axeman 2008-12-14 23:22:59

+0

你的意思是找到。 -type f | xargs perl ...? – 2008-12-15 04:07:05

+0

您可以改用Ruby。在Ruby中,相當於`perl -pi -e`是`ruby -pi -e`。點擊[此鏈接](http://stackoverflow.com/questions/1274605/ruby-search-file-text-for-a-pattern-and-replace-it-with-a-given-value#3502884)瞭解更多信息。 – unforgettableid 2014-12-12 14:12:29

回答

9

'python -h'的命令行用法肯定表明沒有這樣的等價物。 Perl傾向於廣泛使用'$_'(您的示例會隱式使用它),並且我不認爲Python支持任何類似的概念,從而使得Python與Perl單行程序相當困難。

24

Python是爲麻瓜。如果你想要魔法,你應該使用Perl!

10

相當於-pi並不難用Python編寫。

  1. 用自己喜歡的-p和-i功能給自己寫一個方便的模塊。我們稱之爲pypi.py

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

可以實現與fileinput模塊的基本-p循環。

您將有一個函數subs,它實現了打開文件,保存備份副本以及在每行上進行替換的基本「-i」算法。

有一些像這樣的activestate食譜。這裏有一些:

不內置。但不難寫。而且一旦書寫容易定製。

+3

我建議將模塊稱爲pi.py,存儲在site-packages目錄中,以「if __name__ ==」__main __「:`構造結束,然後用`python -mpi ... ` – tzot 2008-12-15 09:22:10

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() 

解析器。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 
2

中的FileInput模塊具有用於就地編輯的能力。不過,你不能放棄備份。以下是如何使用它的一個班輪:

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

個人而言,當我需要做這樣的事情我只是平時使用Perl。這是我使用Perl的幾次之一。

9

我知道這是幾年爲時已晚,但我最近發現 一個非常好的工具,叫做pyp,這確實 你問什麼了。

我覺得你的命令應該是:

pyp "p.replace('foo','bar')" 
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取代( 「{}」。格式(variablehere),「newtext」)

相關問題