管道粘贴到粘贴后保持着色

上色后保存中也有一个类似的问题,但是如果您将有色 grep 输出导入到另一个 grep 中,那么这个有色 grep 将不会被保留,这让我很恼火。

例如,grep --color WORD * | grep -v AVOID不保留第一个输出的颜色。但是对我来说 ls | grep FILE确实保持了颜色,为什么会有差别呢?

45529 次浏览

grep有时会禁用颜色输出,例如在写入管道时

正确的命令行应该是

grep --color=always WORD * | grep -v AVOID

这是相当冗长的,或者你可以只添加行

alias cgrep="grep --color=always"

.bashrc为例,并使用 cgrep作为有色的 grep。当重新定义 grep时,您可能会遇到依赖于 grep的特定输出的脚本的麻烦,并且不喜欢 ascii 转义代码。

给你个建议:

当使用 grep --color=always时,传递到下一个管道的实际字符串将被更改。这可能导致以下情况:

$ grep --color=always -e '1' * | grep -ve '12'
11
12
13

即使选项 -ve '12'应该排除中间行,也不会排除,因为在 12之间有颜色字符。

只需在管道的末尾重复相同的 grep 命令。
grep WORD * | grep -v AVOID | grep -v AVOID2 | grep WORD

现有的答案只针对 FIRST 命令为 grep时的情况(正如 OP 所要求的那样,但是这个问题在其他情况下也会出现)。

更笼统的回答

基本的问题是,| grep之前的命令在意识到输出将进入管道时,试图通过禁用颜色来实现“智能”。这通常是您想要的,以便 ANSI 转义代码不会干扰您的下游程序。

但是,如果希望从早期命令发出彩色输出,则需要强制生成彩色代码,而不管输出接收器是什么。强制机制是特定于程序的。

Git: use-c color.status = always

git -c color.status=always status | grep -v .DS_Store

注意: -c选项必须出现在子命令 status之前。

其他人

(这是一个社区 wiki 帖子,所以随时添加你的)