2017-09-13 144 views
-3

我有一個python腳本,看起來像,我想變換以下的文件:Unix工具解析命令行

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,但是我將如何掃描下幾行來應用邏輯的保留或拒絕部分?

編輯:注意,我正試圖查看在編寫自定義分析器之前使用命令行工具執行此操作是否合理。我知道如何編寫解析器。

+2

Python中有一些工具可以用來操作python,比起試圖將自己的方式轉換爲臨時Python解析器的方式來說,這會更加可靠。 – pvg

+0

你好。你的問題是無關緊要的,很可能會很快關閉。我建議您完成我們的[遊覽](https://stackoverflow.com/tour)並閱讀我們的[幫助中心](https://stackoverflow.com/help)以瞭解本網站的主題。 –

+0

關於黑客新聞如何激進的SO已經有很多評論,並且上面的評論對此進行了描述。不知道爲什麼這被認爲是脫離主題,因爲我想在編寫自定義分析器之前重用現有工具。由於unix有幾十個命令行工具,所以不要期望別人知道所有這些工具... – rottyguy

回答

-1

您尚未指定足夠詳細的問題來推薦特定解決方案,但有許多工具和技術可以處理此類問題。

據我瞭解這一點,你要

  1. 識別類的邊界
  2. 標識類
  3. 中的方法刪除方法缺乏一定的文字特徵

我對此的一般方法應該是一個基於「打開舊文件和新文件的邏輯」的腳本;寫下你從舊文件讀取的所有內容,除非。

您可以輕鬆地寫東西,直到您進入課程(一個標誌)並開始查找方法(另一個標誌)。這裏稍微有點棘手的部分是緩衝:你需要保留每個方法的文本,直到你知道它是否包含目標文本。您可以讀取整個方法(輕微解析任務)並搜索目標文件,也可以只保存文本行,直到找到目標文件(然後返回到您的全部寫入模式)或運行結束(空白沒有寫入的緩衝區)。

這足以讓您用任何方便的語言拼湊腳本來處理問題。 UNIX提供了各種工具;在範例我會用awk。但是,我建議使用易於閱讀的工具,如Python或Perl。如果你想正式進入解析的世界,我建議一個簡單的Lex-YACC對聯:你可以有非常簡單的標記(甚至可以是完整的行,這取決於你的編碼風格)和行爲(寫行,保持行,設置狀態標誌,清空緩衝區等)。

那是足以讓你感動?

+0

好的謝謝。是的,我知道如何編寫自定義解析器(我應該提到這一點),只是想知道在編寫代碼之前是否有一些命令行工具可以用來做這件事。 – rottyguy

+0

沒有像命令行過濾器那麼簡單。 ** awk **可能是最直接的解決方案,但除非您已經知道pattern =>動作語法,否則它不會是您最有效的解決方案。 – Prune