2009-12-02 23 views
9

我需要grep整个目录中的字符串,并且我得到了大约50个结果。我想为每一行的第二行着色,无论是文字颜色还是背景颜色。最好是一个脚本,我可以将任何命令的输出传递给它,并使其吐出相同的(尽管是彩色的)输出。在bash中替换输出线的简单方法

回答

13

不是很漂亮,但做的伎俩:

(这个保存到foo.bashgrep whatever wherever | ./foo.bash

#!/bin/bash 
while read line 
do 
    echo -e "\e[1;31m$line" 
    read line 
    echo -e "\e[1;32m$line" 
done 
echo -en "\e[0m" 

在这里你可以找到list of color codes in bash

+1

很整齐,也可以用作功能,避免第二个脚本。 – 2009-12-02 09:07:24

+3

我喜欢这个,但是忘记了之后重置: echo -en'\ e [0m'; – naught101 2009-12-02 12:00:02

+0

@ naught101好点,现在修复。 – Kimvais 2009-12-02 14:21:35

4

Perl安装在许多系统上。你可以把它替代了你:

grep -r whatever somedir/ | perl -pe '$_ = "\033[1;29m$_\033[0m" if($. % 2)' 

在Perl $.可以$INPUT_LINE_NUMBER被取代,只要你喜欢的可读性。

2

这里是一样的python;

import sys 
for line_number,line in enumerate(sys.stdin.readlines()): 
    print '%s[1;3%dm%s%s[0m' % (chr(27),(line_number % 2+1),line,chr(27)), 
2

这是为了描述我假定的包装线? 此shell脚本使用256 color调色板中的背景颜色 ,以免干扰grep --color可能会执行的其他突出显示。

#!/bin/sh 
c=0 
while read line; do 
    [ $(($c%2)) -eq 1 ] && printf "\033[48;5;60m" 
    printf "%s\033[0m\n" "$line" 
    c=$(($c+1)) 
done 

这样做需要提醒的是行内的反斜杠等,将被截断, 所以把它当作伪代码重新实现

+0

Hah ,如果我已经知道 - 色彩,我可能不需要这个,但都是好的。感谢您深思熟虑的解决方案。 – naught101 2009-12-02 12:03:20