我正在嘗試添加遞歸支持文件grep腳本。
由於某種原因,這不能按預期工作:
RECURSIVE_MODE=off
# iterate over args
for ARG in "$@"
do
if [ -d "$ARG" ] && [ $RECURSIVE_MODE = on ] ; then
# recursive call
$0 $GREP_ARGS $ARG/*
elif [ -f "$ARG" ]; then
filecat "$ARG" | grep $GREP_ARGS | sed "s#^#$ARG: #"
else
[ "$ARG" = "-r" ] && RECURSIVE_MODE=on
# append to the current grep args
GREP_ARGS="$GREP_ARGS $ARG"
fi
done
我想避免在這種情況下使用函數以獲得更好的可讀性。
編輯:腳本應該像這樣工作:
對於每個傳遞的參數:
- 如果當前arg是目錄,檢查是否啟用了遞歸模式,如果是則進行遞歸呼叫;
- 否則如果當前 arg 是文件,則使用
grep
當前模式呼叫; - 否則假設目前 arg 是 grep 模式或 grep 開關並將其附加到目前
$GREP_ARGS
清單。
也許這並不完全可靠,但它對我來說很好用,可以替代zgrep
、pdfgrep
等。
答案1
嘗試使用-H
以下選項grep
:
-H, --with-filename Print the filename for each match.
因此,不必調用腳本,只需執行以下操作:
grep -H PATTERN [FILE...]
另外,在嘗試編寫包裝器腳本之前,最好先檢查您正在使用的工具的手冊頁。對於常見的 Unix 工具,您想要的簡單選項幾乎總是已經內建在工具中。
答案2
我終於發現問題出grep
在-r
開關上忽略 stdin 並在當前工作目錄中搜索。為了強制讀取標準輸入,我剛剛添加了一個-
:
filecat "$ARG" | grep $GREP_ARGS - | sed "s#^#$ARG: #"