我目前通过一堆不好记的AWK、sed、Bash和一小部分Perl来做我的文本文件操作。

我已经看到提到的一些地方,python很适合做这种事情。我如何使用Python来代替shell脚本,AWK, sed和朋友?


当前回答

最好的选择是专门针对您的问题的工具。如果它正在处理文本文件,那么Sed、Awk和Perl是最佳竞争者。Python是一种通用动态语言。与任何通用语言一样,它支持文件操作,但这不是它的核心目的。如果我特别需要一种动态语言,我会考虑Python或Ruby。

简而言之,非常好地学习Sed和Awk,以及所有其他随*nix风格而来的好东西(所有Bash内置,grep, tr等等)。如果您感兴趣的是文本文件处理,那么您已经使用了正确的方法。

其他回答

截至2015年和Python 3.4的发布,现在有一个相当完整的用户交互shell: http://xon.sh/或https://github.com/scopatz/xonsh

演示视频没有显示正在使用的管道,但是在默认shell模式下支持管道。

Xonsh(“conch”)非常努力地模仿bash,因此您已经获得了肌肉记忆,例如

env | uniq | sort -r | grep PATH

or

my-web-server 2>&1 | my-log-sorter

仍然可以正常工作。

本教程相当冗长,似乎涵盖了人们通常在ash或bash提示符时所期望的大量功能:

Compiles, Evaluates, & Executes! Command History and Tab Completion Help & Superhelp with ? & ?? Aliases & Customized Prompts Executes Commands and/or *.xsh Scripts which can also be imported Environment Variables including Lookup with ${} Input/Output Redirection and Combining Background Jobs & Job Control Nesting Subprocesses, Pipes, and Coprocesses Subprocess-mode when a command exists, Python-mode otherwise Captured Subprocess with $(), Uncaptured Subprocess with $[], Python Evaluation with @() Filename Globbing with * or Regular Expression Filename Globbing with Backticks

我在PyPI: ez上发布了一个包。 使用pip install ez进行安装。

它在shell中打包了通用命令,我的库使用了与shell基本相同的语法。例如,cp(源,目标)可以同时处理文件和文件夹!(书纸的包装。shutil副本。Copytree,它决定什么时候使用哪个)。更妙的是,它可以支持像R!

另一个例子:没有os。Walk,使用fls(path, regex)递归地查找文件并使用正则表达式进行过滤,它将返回带有或没有全路径的文件列表

最后一个例子:你可以结合它们来编写非常简单的脚本: Files = fls('.','py$');文件,myDir (cp)

一定要去看看!我花了几百个小时来编写/改进它!

是的,当然。

看看这些库,它们可以帮助你不再编写shell脚本(Plumbum的座右铭)。

铅 军士 上海

另外,如果你想用基于Python的东西替换awk, sed和grep,那么我推荐pyp -

“The Pyed Piper”,或pyp,是一个linux命令行文本操作 工具类似于awk或sed,但使用标准的python字符串和 列表方法以及自定义函数进化为快速生成 在紧张的生产环境中产生的结果。

如果你的文本文件操作通常是一次性的,可能在shell提示符下完成,你从python中不会得到更好的东西。

另一方面,如果你经常不得不一遍又一遍地做同样的(或类似的)任务,并且你必须为此编写脚本,那么python是很棒的——你可以很容易地创建自己的库(你也可以用shell脚本来做,但它更麻烦)。

这是一个很简单的例子。

import popen2
stdout_text, stdin_text=popen2.popen2("your-shell-command-here")
for line in stdout_text:
  if line.startswith("#"):
    pass
  else
    jobID=int(line.split(",")[0].split()[1].lstrip("<").rstrip(">"))
    # do something with jobID

还要检查sys和getopt模块,它们是您首先需要的。

Pythonpy是一个工具,可以方便地访问awk和sed的许多特性,但使用python语法:

$ echo me2 | py -x 're.sub("me", "you", x)'
you2