我正在尝试添加递归支持文件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: #"