grep 与函数中的heredoc

grep 与函数中的heredoc

我想创建一个从粘贴在终端中的文本进行解析的函数。

$ cat <<eof | grep --color sometext
> foo
> sometext
> sometext1
> a sometext
> asdf
> 
> eof
sometext
sometext1
a sometext

虽然上面的方法有效,但我既不能创建别名,也不能创建它的函数。

alias gsi='cat <<eof | grep --color "$1"'
gsi { cat <<eof | grep --color "$1" ; }

我认为在函数定义期间没有执行重定向。

答案1

alias 'gsi=<<eof grep --color'

可以作为别名工作,就像预处理器文本替换一样,其中替换再次被解释为 shell 代码。

你的没有像你那样工作"$1"gsi file.txt替换为,cat <<eof | grep --color "$1" file.txt然后 shell 继续解释该命令行,$1此时 shell 的第一个位置参数可能为空,除非您set something事先执行了操作。所以你想"$1"在这里删除它。您也可以删除 UUOC。

gsi() { cat <<eof | grep --color "$1" ; }

从语法的角度来看是错误的,因为eof之后缺少该行cat <<eof

答案2

您的函数不会使用此处文档:

gsi () {
   grep --color "$@"
}

这将使您能够将模式以及任何其他选项传递到grep公共线路上,并grep从标准输入中读取。

输入结束将通过按 来发出信号Ctrl+D

上面的内容可能会混合粘贴的内容和结果grep。先把粘贴的内容积累起来然后运行grep,你可以使用类似的东西

gsi () {
    trap 'rm -f "$buffer"' RETURN
    local buffer="$(mktemp)"
    cat >"$buffer" && grep --color "$@" "$buffer"
}

grep在这里,粘贴的输出在运行之前被放入临时文件中。当函数退出时,临时文件将被删除。这大约是bash当您粘贴到此处文档时在幕后执行的操作。

答案3

您提到您要粘贴到终端。完全放弃here-doc,并使用适当的剪贴板实用程序,例如xclip(或pbpaste在Mac OS X上)。这样xclip就可以完成

xclip -o -sel clip | grep --color 'sometext'

也可以看看“xclip”与“xsel”关于两个实用程序之间的差异。

相关内容