Grep-在每次出现的行中获取字符位置

时间:2019-05-02 17:15:27

标签: bash grep cygwin gnu

根据手册,选项-b可以给出给定事件的字节偏移量,但它似乎是从已解析内容的开头开始的。

我需要检索grep返回的每个匹配内容的位置。我使用了这一行,但是非常难看:

WSAEventSelect()

如何通过更有效地使用GNU utils以更优雅的方式完成它?

示例:

WSAPoll()

(实际上,此命令行不输出行号,但添加它并不难。)

2 个答案:

答案 0 :(得分:2)

在任何UNIX盒的任何shell中使用任何awk(GNU或其他方式):

$ awk -v re='efg' -v OFS=':' '{
    end = 0
    while( match(substr($0,end+1),re) ) {
        print NR, end+=RSTART, substr($0,end,RLENGTH)
        end+=RLENGTH-1
    }
}' test.txt
1:5:efg
1:13:efg

awk中的所有字符串,字段,数组索引都从1开始,而不是零,因此输出结果看起来不像您的那样,因为awk您的输入字符串是:

123456789012345
abcdefg abcdefg

而不是:

012345678901234
abcdefg abcdefg

如果您希望使用0索引的字符串,可以随意将上面的代码更改为end+=RSTART-1end+=RLENGTH

答案 1 :(得分:1)

Perl不是GNU util,但可以很好地解决您的问题:

perl -nle 'print "$.:$-[0]" while /efg/g'