我想创建一个从粘贴在终端中的文本进行解析的函数。
$ 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”关于两个实用程序之间的差异。