我有一个文件:file.txt,其中包含以下数据。 GNU grep版本:2.5.1,系统管理员拒绝将其升级到更高版本,因为它可能会影响生产
This is a file, my name is Karl, what is this process, karl is karl junior, file is a test file, file's name is file.txt
My name is not Karl, my name is Karl Joey
What is your name?
Do you know your name and what it is?
当我运行以下命令以使用以下命令在此文件中获取单词“is”的行#时,它给出了如下输出:
$ grep -now“是”file.txt
1:is
is
is
is
is
is
2:is
is
3:is
4:is
我可以运行什么命令来获得以下输出:
1:is
1:is
1:is
1:is
1:is
1:is
2:is
2:is
3:is
4:is
或
is:1,1,1,1,1
is:2,2
is:3
is:4
如果我正在尝试以下命令,我会接近但我想用is替换1并且用1(逗号分隔) grep -now“是”file.txt | tr'\ 012'''| sed“s /([0-9]:)/ \ n \ 1 / g”| grep“。”
1:is is is is is is
2:is is
3:is
4:is
答案 0 :(得分:1)
如果您可以使用perl
,那么此处正在使用他们的last match start (@-)和last match end (@+):
perl -lne '
while ($_ =~ /\bis\b/g) {
print "$.:", substr($_, $-[0], $+[0] - $-[0]);
}' file
1:is
1:is
1:is
1:is
1:is
1:is
2:is
2:is
3:is
4:is
基于OP的请求的新格式:
perl -lne '
$found =()= /\bis\b/g;
print substr($_, $-[0], $+[0] - $-[0]), ":", join (",", ($.) x $found);
' file
is:1,1,1,1,1,1
is:2,2
is:3
is:4
将GNU awk
用于字边界:
gawk '{
n = gsub(/\<is\>/,"");
printf "%s:", "is";
for (i=1; i<=n; i++) printf "%s%s", NR, (i==n?RS:",")
}' file
is:1,1,1,1,1,1
is:2,2
is:3
is:4
使用vanilla awk
(礼貌Ed Morton(见评论)):
awk '
{
n = gsub(/(^|[^[:alpha:]])is([^[:alpha:]]|$)/,"");
printf "%s:", "is";
for (i=1; i<=n; i++) printf "%s%s", NR, (i==n?RS:",")
}' file
is:1,1,1,1,1,1
is:2,2
is:3
is:4
答案 1 :(得分:0)
grep -o -n "is" file.txt
似乎可以在我的系统上运行。
答案 2 :(得分:0)
如果您可以升级grep
的版本,则应该修复它:
# grep --version
grep (GNU grep) 2.16
Copyright (C) 2014 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
Written by Mike Haertel and others, see <http://git.sv.gnu.org/cgit/grep.git/tree/AUTHORS>.
# grep -now is file
1:is
1:is
1:is
1:is
1:is
1:is
2:is
2:is
3:is
4:is
使用grep
模仿perl
的输出:
# perl -lne '$x = "is"; $c = () = /\b$x\b/g; while ($c--) { print "$.:$x"; }' file
1:is
1:is
1:is
1:is
1:is
1:is
2:is
2:is
3:is
4:is
另:
# perl -lne '$x = "is"; $c = () = /\b$x\b/g; next unless $c--; $t = "${x}:$."; $t .= ",$." while ($c--); print $t' file
is:1,1,1,1,1,1
is:2,1
is:3
is:4