与grep的字符偏移

时间:2017-01-18 11:28:07

标签: bash grep

当我在我的bash终端上运行时:

grep -ob "amilase" <<< "α-amilase"

我明白了:

3:amilase

让我们将字节偏移量定义为匹配字之前的字节数,将字符偏移量定义为匹配字之前的用户可见字符数。

在上面,3对应于匹配字的字节偏移。 α是一个占用2个字节的unicode字符,这就是我们得到3的原因。

但是如何获得字符偏移量,在这种情况下是2?为什么2?如果您查看屏幕并计算匹配单词之前存在多少个可见符号,则计数为2。

我正在寻找一种行为类似grep -o的解决方案,也就是说,如果每行有多个匹配项,则会报告它们。

2 个答案:

答案 0 :(得分:3)

你可以鞭打自己的穷人的傻瓜!

将它放在一个名为mygrep

的脚本中
#!/bin/bash

# Takes extended regex as first argument
# Text to match received on standard in
if
  [[ $# != 1 ]]
then
 echo "This script takes one argument as input"
 exit 1
fi

while IFS= read -r LINE
do
  while true
  do
    [[ "$LINE" =~ ^(.*)($1)(.*)$ ]] || break
    echo "${#BASH_REMATCH[1]}:$1"
    LINE="${BASH_REMATCH[1]}"
  done | tac
done

然后只需在命令中替换grep

mygrep "amilase" <<< "α-amilase"

脚本遍历所有输入行,将每一行与作为参数接收的正则表达式匹配(它可以是一个简单的字符串,但如果需要,您可以使用正则表达式的全部功能)。我更新了我的答案,允许在一行上进行多项匹配。 | tac用于反转行的顺序,因为贪婪匹配首先匹配每行的最后一次出现:如果你不介意反向出现匹配,只需删除| tac

我不确定输出是否符合您的要求,您可以轻松自定义。

请注意=~运算符执行模式匹配(egrep语法),BASH_REMATCH是用于访问(从索引1开始)括号内的子表达式的数组。

答案 1 :(得分:1)

如果你想要一个基于0的匹配索引,你可以尝试使用awk:

awk '{print index($0,"amil")-1}'<<< "α-amilase"    
2

awk '{print index($0,"amil")-1}'<<< "fooamilα-whatever"        
3

如果未找到匹配项,则会打印-1