Bash
如何使 bash 內置“讀取”忽略註釋或空行?
(為簡單起見,我假設要讀取的文件是第一個參數 -
$1
。)我可以在外部做我想做的事:
tempfile=$(mktemp) awk '/^#/ {next}; NF == 0 {next}; {print}' "$1" > $tempfile while read var1 var2 var3 var4 < $tempfile; do # stuff with var1, etc. done
awk
但是,每次解析配置文件時都需要呼叫似乎很荒謬。有沒有一種方法可以read
忽略文件中的註釋行或僅空白行,而不會出現外部二進製文件/潛在的性能問題?到目前為止的答案非常有幫助!澄清一下,我不想使用臨時文件,但我確實想從文件中讀取配置,而不是從標準輸入中讀取配置。我很清楚我可以在呼叫腳本時使用輸入重定向,但是由於各種原因,在我的情況下不起作用。
我想對輸入進行軟編碼以讀取,例如:
configfile="/opt/myconfigfile.txt" [ $# -gt 0 ] && [ -r "$1" ] && configfile="$1" while read var1 var2 var3 var4 < "$configfile" ; do ...
configfile
但是當我嘗試這個時,它只是一遍又一遍地讀取第一行,直到我終止程序。也許這應該是它自己的問題……但這可能是我正在做的單行更改。我的錯誤在哪裡?
您不需要臨時文件來執行此操作,並且 sed(或 awk)在註釋處理方面比 shell case 語句靈活得多。
例如:
configfile='/opt/myconfigfile.txt' [ $# -gt 0 ] && [ -r "$1" ] && configfile="$1" sed -e 's/[[:space:]]*#.*// ; /^[[:space:]]*$/d' "$configfile" | while read var1 var2 var3 var4; do # stuff with var1, etc. done
這會去除註釋(帶或不帶前導空格)並從輸入中刪除空行,然後再將其輸送到 while 循環中。它自己處理行註釋和附加到行尾的註釋:
# full-line comment # var1 var2 var3 var4 abc 123 xyz def # comment here
呼叫
sed
或awk
執行這樣的任務並不“荒謬”,這是完全正常的。這就是這些工具的用途。至於性能,我敢打賭,除了非常小的輸入文件之外,sed
版本會快得多。管道到sed
有一些啟動成本,但執行速度非常快,而 shell 很慢。