Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 当输入不是一行时,为搜索结果着色_Bash_Perl_Awk_Grep - Fatal编程技术网

Bash 当输入不是一行时,为搜索结果着色

Bash 当输入不是一行时,为搜索结果着色,bash,perl,awk,grep,Bash,Perl,Awk,Grep,我试图用突出显示的搜索字符串打印整个文件的内容 对于记录等于一行的简单文件,我可以使用以下方法轻松完成此操作: grep --color=auto "myseacrchpattern" inputfile 在这里,我的记录是以段落而不是单行的形式出现的。例如: CREATE TABLE mytable ( id SERIAL, name varchar(20), cost int ); CREATE TABLE notmytable ( id SERIAL, name varchar(20)

我试图用突出显示的搜索字符串打印整个文件的内容

对于记录等于一行的简单文件,我可以使用以下方法轻松完成此操作:

grep --color=auto "myseacrchpattern" inputfile
在这里,我的记录是以段落而不是单行的形式出现的。例如:

CREATE TABLE mytable ( id SERIAL,
name varchar(20),
cost int );

CREATE TABLE notmytable ( id SERIAL,
name varchar(20),
cost int );
若我使用grep作为关键字:notmytable,它将给我彩色输出,但只打印该行

grep --color=auto 'notmytable' inputfile
CREATE TABLE notmytable ( id SERIAL,  # <-- "notmytable" is in red but its not the whole query
或perl:

perl -00lne 'print $_ if /notmytable/' inputfile
CREATE TABLE notmytable ( id SERIAL,
name varchar(20),
cost int );
:constants标记提供红色等。还有其他方法,请参见

请注意,必须进行一些重复搜索,因为我们需要首先识别段落,然后在正常打印其他段落时仅打印该行的颜色

如果只需要对模式进行着色,则不需要进行双重解析,而且更简单、更好

perl -MTerm::ANSIColor -00lnE'say if s/(notmytable)/colored($1,"red")/eg' input
:constants标记提供红色等。还有其他方法,请参见

请注意,必须进行一些重复搜索,因为我们需要首先识别段落,然后在正常打印其他段落时仅打印该行的颜色

如果只需要对模式进行着色,则不需要进行双重解析,而且更简单、更好

perl -MTerm::ANSIColor -00lnE'say if s/(notmytable)/colored($1,"red")/eg' input
将您的awk或perl解决方案与grep结合使用:

-C1000选项使grep在匹配行周围保留1000行周围的上下文,实际上将grep变成了一个纯粹的着色器,而不是行选择器

您可以将其包装到bash函数中:

function paragrep() { perl -00lne 'print $_ if /'"$1"/ "$2"|grep -C1000 "$1"; }
用法示例:

$ paragrep notmytable input
CREATE TABLE notmytable ( id SERIAL,    # <---"notmytable" is in red
name varchar(20),
cost int );

$
将您的awk或perl解决方案与grep结合使用:

-C1000选项使grep在匹配行周围保留1000行周围的上下文,实际上将grep变成了一个纯粹的着色器,而不是行选择器

您可以将其包装到bash函数中:

function paragrep() { perl -00lne 'print $_ if /'"$1"/ "$2"|grep -C1000 "$1"; }
用法示例:

$ paragrep notmytable input
CREATE TABLE notmytable ( id SERIAL,    # <---"notmytable" is in red
name varchar(20),
cost int );

$

如果找到与所需regexp匹配的字符串,则用适当的字符将其环绕,以更改其颜色并打印包含该字符串的记录:

$ awk -v RS=';' -v ORS=';\n' 'gsub(/notmytable/,"<RED>&</RED>")' file
CREATE TABLE <RED>notmytable</RED> ( id SERIAL,
name varchar(20),
cost int );
或者,如果不想硬编码这些颜色值,可以执行以下操作:

awk -v RS=';' -v ORS=';\n' -v red="$(tput setaf 1)" -v nrm="$(tput sgr0)" 'gsub(/notmytable/,red"&"nrm)' file

顺便说一句,如果所有记录之间都有空行,您可能会发现使用-vrs=-vrs='\n\n'比使用-vrs=';'更适合您-v ORS='\n.

如果找到与所需regexp匹配的字符串,则用适当的字符将其环绕,以更改其颜色并打印包含该字符串的记录:

$ awk -v RS=';' -v ORS=';\n' 'gsub(/notmytable/,"<RED>&</RED>")' file
CREATE TABLE <RED>notmytable</RED> ( id SERIAL,
name varchar(20),
cost int );
或者,如果不想硬编码这些颜色值,可以执行以下操作:

awk -v RS=';' -v ORS=';\n' -v red="$(tput setaf 1)" -v nrm="$(tput sgr0)" 'gsub(/notmytable/,red"&"nrm)' file


顺便说一句,如果所有记录之间都有空行,您可能会发现使用-vrs=-vrs='\n\n'比使用-vrs=';'更适合您-v ORS='\n.

有关Perl,请参阅Perl-e'use Term::ANSIColor;红色打印,停止\n、 色彩重置;打印颜色绿色,开始\n、 颜色重置;'在这种情况下,您可以使用grep:grep-a2notmytable的上下文控制选项input@Leon,我想到了它,但无法使用,因为在实际数据集中,行数是动态的。@PS。您可以使用此模块动态构建print语句。有关Perl,请参阅Perl-e'use Term::ANSIColor;红色打印,停止\n、 色彩重置;打印颜色绿色,开始\n、 颜色重置;'在这种情况下,您可以使用grep:grep-a2notmytable的上下文控制选项input@Leon,我想到了,但无法使用,因为实际数据集中的行数是动态的。@PS。您可以使用此模块动态生成打印语句。谢谢,但这是对整个段落的着色。只需要给匹配的字符串上色。我的perl verison是perl,v5.10。1@PS.对,看起来是这样的,但您的perl示例让我产生了不同的想法。这对于一行来说太多了-必须将字符串段落分成几行,匹配颜色和打印其他内容…@PS。好的,修复它。。。请随意加入一个脚本:@PS。我意识到你实际上可能只想要有颜色的图案,而不是整行。这更容易,加上回答谢谢,但这是整个段落的颜色。只需要给匹配的字符串上色。我的perl verison是perl,v5.10。1@PS.对,看起来是这样的,但您的perl示例让我产生了不同的想法。这对于一行来说太多了-必须将字符串段落分成几行,匹配颜色和打印其他内容…@PS。好的,修复它。。。请随意加入一个脚本:@PS。我意识到你实际上可能只想要有颜色的图案,而不是整行。这更容易,添加到回答器中,您可以在perl | grep-color.*'之后使用,perl打印的任何内容都将是彩色的。或者您可以在perl | grep-color.*'之后使用,perl打印的任何内容都将是彩色的。非常好的答案,经过一些调整,使其在真实数据中工作。尽管有一个问题,为什么gsub不在{…}内??我们不必在{…}内放置操作吗?不,您不必在{}内放置操作,但请注意,如果不这样做,则其结果将被视为一个条件,因此可能导致新操作发生,如果结果为真,则默认打印$0。在本例中,gsub返回它执行的替换数量的计数,因此我使用它来执行替换
,并在进行任何替换时触发默认的打印$0操作。这相当于编写{if/foo/{gsub/foo/,bar;print$0}}非常好的答案,经过一些调整使其在真实数据中工作。尽管有一个问题,为什么gsub不在{…}内??我们不必在{…}内放置操作吗?不,您不必在{}内放置操作,但请注意,如果不这样做,则其结果将被视为一个条件,因此可能导致新操作发生,如果结果为真,则默认打印$0。在本例中,gsub返回它执行的替换数量的计数,因此我使用它来执行替换,并在进行任何替换时触发默认的print$0操作。这相当于编写{if/foo/{gsub/foo/,bar;print$0}