【问题标题】:unix tools to parse file on the command line用于在命令行上解析文件的 unix 工具
【发布时间】:2018-02-22 10:39:19
【问题描述】:

我有一个如下所示的 Python 脚本,我想对其进行转换:

import sys
# more imports


''' some comments '''

class Foo:
   def _helper1():
      etc.

   def _helper2():
      etc.

   def foo1():
      d = { a:3, b:2, c:4 }
      etc.

   def foo2():
      d = { a:2, b:2, c:7 }
      etc.

   def foo3():
      d = { a:3, b:2, c:7 }
      etc.

   etc.

   if __name__ == "__main__":    
      etc.

我希望能够仅解析 foo*() 函数并仅保留具有某些属性的函数,例如 d={a:3, b:2}。显然保留所有非foo*() 的东西,这样转换仍然会运行。尽管d 可能有不同的键、值,但foo*() 的定义会很好。

是否有一些我可以通过链接使用的 unix 工具集?我可以使用grep 来识别foo,但是如何扫描接下来的几行以应用我的逻辑的保留或拒绝部分?

编辑:注意,我正在尝试在编写自定义解析器之前使用命令行工具执行此操作是否合理。我知道如何编写解析器。

【问题讨论】:

  • python 中内置了一些用于操作 python 的工具,这将比尝试正则表达式进入临时 python 解析器更可靠。
  • 你好。你的问题是题外话,很可能很快就会结束。我建议您完成我们的tour 并阅读我们的help center 以了解本网站的主题。
  • hackernews 上有很多 cmets 关于 SO 变得多么激进,上面的评论强调了这一点。不知道为什么这被认为是题外话,因为我试图在编写自定义解析器之前重用现有工具。由于 unix 有几十个命令行工具,所以不要期望人们知道所有这些工具是有效的......
  • 这更像是一个工具建议问题,而不是一个编程问题。但要回答您的问题,请查看 sed 和 awk。也就是说,@pvg 是绝对正确的;为此,您应该使用 python 标准库中内置的工具。
  • 网站文档非常清楚地解释了为什么这些问题是题外话。看看help center

标签: python unix command-line-tool command-line-arguments


【解决方案1】:

您没有详细说明您的问题以推荐特定的解决方案,但有许多工具和技术可以处理此类问题。

据我了解,你想

  1. 确定班级的界限
  2. 识别类中的方法
  3. 删除缺少某些文本特征的方法

我对此的一般方法是使用基于“打开旧文件和新文件;写入从旧文件中读取的所有内容,除非.”的逻辑的脚本。

你可以愉快地写东西,直到你进入班级(一个标志)并开始寻找方法(另一个标志)。这里一个稍微棘手的部分是缓冲:您需要保留每个方法的文本,直到您知道它是否包含目标文本。您可以阅读整个方法(次要解析任务)并搜索目标,也可以简单地保留文本行直到找到目标(然后返回您的全写模式)或运行结束(空缓冲区没有写入)。

这很简单,您可以用任何方便的语言编写脚本来处理问题。 UNIX提供了多种工具;在 范例中,我会使用 awk。但是,我推荐使用易于阅读的工具,例如 Python 或 Perl。如果您想正式进入解析世界,我建议您使用一个简单的 Lex-YACC 对联:您可以拥有非常简单的标记(甚至可能是完整的行,取决于您的编码风格)和操作(写行、保持行、设置状态)标志、刷新缓冲区等)。

这足以让你感动吗?

【讨论】:

  • 好的,谢谢。是的,我知道如何编写自定义解析器(我应该提到这一点),只是想知道在编写代码之前是否可以使用一些命令行工具来执行此操作。
  • 没有什么比命令行过滤器更简单了。 awk 可能是最直接的解决方案,但除非您已经知道 pattern=>action 语法,否则它不会是您最有效的解决方案。
猜你喜欢
  • 2014-02-08
  • 1970-01-01
  • 1970-01-01
  • 2010-09-12
  • 2011-12-11
  • 2022-05-19
  • 2021-07-14
  • 2020-03-24
  • 2018-05-15
相关资源
最近更新 更多