Text-Processing
有沒有辦法只顯示文本文件/腳本中未註釋的行?
很多時候,當手動瀏覽文件時,有太多的註釋讓你的眼睛發呆,你開始希望有一種方法可以讓你只顯示那些沒有註釋的行。
有沒有辦法用 cat 或其他工具跳過評論?我猜有一種方法,它涉及正則表達式。我希望它只是顯示而不是實際刪除任何行等。
註釋採用# 的形式,我使用zsh 作為我的xterm。
嗯,這取決於你的評論是什麼意思。如果只是沒有 a 的行,
#
那麼一個簡單的:grep -v '#'
可能就足夠了(但這會像
echo '#'
評論一樣呼叫行)。如果註釋行是以開頭的行#
,那麼您可能需要:grep -v '^#'
如果註釋行是
#
在一些可選空格之後開始的行,那麼您可以使用:grep -v '^ *#'
如果評論格式完全不同,這個答案對你沒有幫助。
只是 grepping 將永遠無法刪除所有評論(或僅評論),因為 grep 不理解它正在經歷的語言。要了解什麼是註釋,什麼不是註釋,您需要一個能夠理解該特定語言的詞法分析器。
SO上有幾個關於如何從特定程式語言中刪除所有註釋的答案。我將在這裡添加兩個範例。
對於C ,Josh Lee的回答認為:
gcc -fpreprocessed -dD -E test.c
它執行預處理器但保留宏。
對於python ,unutbu 的答案(我自己做了一個小的改編)使用 tokenize 編寫了一個小型詞法分析器:
import tokenize import io import sys def nocomment(s): result = [] g = tokenize.generate_tokens(io.BytesIO(s).readline) for toknum, tokval, _, _, _ in g: # print(toknum,tokval) if toknum != tokenize.COMMENT: result.append((toknum, tokval)) return tokenize.untokenize(result) print(nocomment(sys.stdin.read()))
然後,您可以為每種程式語言編寫其中一個並使用案例。假設呼叫了python lexer
remove-comments.py
#!/bin/sh case "$1" in *.py) remove-comments.py < "$1" break ;; *.c|*.C|*.cc) gcc -fpreprocessed -dD -E "$1" break ;; *) echo I do not know how to remove comments from $1, sorry break ;; esac
為腳本命名並為您需要/使用的語言添加詞法分析器。這應該是一個或多或少的穩健設計,用於從不同文件類型中刪除評論。(在文件名上使用
file
而不是大小寫也會更健壯)。