ben*_*zzy 6 grep bash function arguments
我对通用解决方案感兴趣,但我的具体示例问题是编写一个.bashrc函数,该函数grep在缺少文件路径时将文件路径包装并附加到命令中。基本上,任何时候 grep 都会等待 stdin 我希望它搜索特定文件。我的问题是如何判断(在包装器中)最后一个参数是要搜索的路径还是搜索模式。
$ ls
example_file.txt
$ grep -someopts 'somestring' 'example_file.txt'
Run Code Online (Sandbox Code Playgroud)
假装这-someopts实际上是 grep 的任意有效选项。
最后一个参数是模式(要搜索)还是文件(要搜索)?
如果somestring是 -options 之一的参数,则example_file.txt是要搜索的模式,并且 grep 将在 stdin 上等待。否则,somestring是要搜索的模式example_file.txt并将被搜索。
在前一种情况下,我想在命令的末尾附加我自己的文件以供搜索,但我无法在没有误报的情况下检测到所述情况。唯一的方法似乎是让包装器考虑 grep 可能采用的每个参数。
这是我的包装函数(check_has_path我需要实现的地方):
function grep_wrapped() {
if check_has_path ; then
grep "$@"
else
grep "$@" '/default/filepath.txt'
fi
}
Run Code Online (Sandbox Code Playgroud)
方法:将命令行选项与命令行上的模式和可能的文件名分开,然后计算不是选项的命令行参数。如果有多个,请按原样运行命令,否则在文件上标记。
在bash:
mygrep () {
local -a opts
while [ "$#" -gt 0 ]; do
case "$1" in
--) opts+=( "$1" ); shift; break ;;
-*) opts+=( "$1" ) ;;
*) break
esac
shift
done
if [ "$#" -gt 1 ]; then
grep "${opts[@]}" "$@"
else
grep "${opts[@]}" "$@" "/my/file"
fi
}
Run Code Online (Sandbox Code Playgroud)
该函数将命令行选项与命令行的其余部分分开,并检查是否存在多个非选项命令行参数(即模式以外的参数)。如果没有,您的文件将被标记到命令的末尾。
如果您使用带有选项参数的选项(例如 ),这将不起作用-e PATTERN,因此它有些缺陷。也许它可以作为其他人的起点?
从评论中可以清楚地看出,用户根本对运行不grep感兴趣,而是对搜索具有特定扩展名的文件感兴趣。
下面的 shell 函数可以做到这一点:
extfind () {
local ext="$1"
if [ -z "$ext" ]; then
echo 'Missing extension' >&2
return 1
fi
shift
local dir="${1:-$HOME}"
find "$dir" -type f -name "*.$ext"
}
Run Code Online (Sandbox Code Playgroud)
该函数将用作
$ extfind txt
Run Code Online (Sandbox Code Playgroud)
查找.txt主目录中或主目录下名称以结尾的所有文件,或者
$ extfind "[hc]" /usr/src
Run Code Online (Sandbox Code Playgroud)
查找目录中.h或目录.c下名称以 或结尾的所有文件/usr/src。