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 らしさ) がうまく機能する理由だと感じていperl -pi -eますが、Python では、re モジュールをインポートし、re インスタンスを作成してからキャプチャするという行に沿って何かを行う必要があります。標準入力ですが、おそらくそれをすべて実行する Python ショートカットがあり、私はそれを見逃しました (ひどく見逃してしまいました)...

4

6 に答える 6

10

''からのコマンドラインの使用法は、python -h確かにそのような同等のものがないことを強く示唆しています。Perlは''を広範囲に使用する傾向があり$_(あなたの例では暗黙的に使用しています)、Pythonが同様の概念をサポートしているとは思わないため、PythonのPerlワンライナーに相当するものははるかに難しくなります。

于 2008-12-14T23:53:48.453 に答える
10

-pi に相当するものは、Python で書くのはそれほど難しくありません。

  1. あなたが本当に好きな -p と -i 機能を備えた便利なモジュールを自分で書いてください。と呼びましょうpypi.py

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

基本的な -p ループはfileinputモジュールで実装できます。

subsファイルを開き、バックアップ コピーを保存し、各行で置換を行うという基本的な「-i」アルゴリズムを実装する関数が必要です。

このようなアクティブ状態のレシピがいくつかあります。ここにあるいくつかの:

内蔵していません。しかし、書くのは難しくありません。一度書いたら簡単にカスタマイズできます。

于 2008-12-15T00:58:30.693 に答える
9

これが数年遅すぎることはわかっていますが、最近pypという非常に優れたツールを見つけました。これはまさにあなたが求めていたものを実行します。

あなたのコマンドは次のようになるべきだと思います:

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

この種のオンザフライ スクリプトには、perl の方が適していると思います。オンザフライの 1 回限りのスクリプティング機能が必要な場合は、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 を使用する数少ない例の 1 つです。

于 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 に答える