我知道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-ness)使得perl -pi -e
工作得很好,而使用Python你必须做一些导入re模块的事情,创建一个re实例然后捕获stdin,但也许有一个Python快捷方式可以完成所有这些并且我错过了它(非常想念它)...
答案 0 :(得分:28)
Python适用于麻瓜。如果你想要魔法,你应该使用Perl!
答案 1 :(得分:10)
“python -h
”的命令行用法肯定强烈暗示没有这样的等价物。 Perl倾向于广泛使用'$_
'(你的例子隐式使用它),我不认为Python支持任何类似的概念,从而使得Perl单行的Python等价物变得更加困难。 / p>
答案 2 :(得分:10)
等效于-pi并不难用Python编写。
使用您真正喜欢的-p和-i功能为自己编写一个方便的模块。我们称之为pypi.py
。
使用python -c 'import pypi; pypi.subs("this","that")'
您可以使用fileinput模块实现基本的-p循环。
你有一个函数subs
,它实现了打开文件,保存备份副本以及在每一行上替换的基本“-i”算法。
有一些像这样的有效状态食谱。以下是一些:
不是内置的。但写起来并不难。并且一旦编写易于定制。
答案 3 :(得分:9)
答案 4 :(得分: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()
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
答案 5 :(得分:2)
fileinput模块具有就地编辑功能。但是,您无法免除备份。以下是如何将它用于单线程:
python -c 'import fileinput, sys; for line in fileinput.input(inplace=True): sys.stdout.write(line, "foo", "bar")'
就个人而言,当我需要做这样的事情时,我通常只使用Perl。这是我使用Perl的少数几次之一。
答案 6 :(得分:0)
以上内容可能适用于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”)