首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带grep的字符偏移

问带grep的字符偏移
EN

Stack Overflow用户
提问于 2017-01-18 11:28:07
回答 2查看 1.5K关注 0票数 3

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

代码语言:javascript
复制
grep -ob "amilase" <<< "α-amilase"

我明白了:

代码语言:javascript
复制
3:amilase

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

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

但是如何获得字符偏移量,在本例中是2?为什么是2?如果您查看屏幕并计算匹配单词之前存在多少可见符号,您将数到2。

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

EN

回答 2

Stack Overflow用户

发布于 2017-01-18 11:48:39

你可以把你自己的可怜人的grep弄出来!

将其放入一个名为“mygrep”的脚本中:

代码语言:javascript
复制
#!/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:

代码语言:javascript
复制
mygrep "amilase" <<< "α-amilase"

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

我不确定输出是否是您想要的,您可以轻松地定制它。

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

票数 3
EN

Stack Overflow用户

发布于 2017-01-18 11:49:29

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

代码语言:javascript
复制
awk '{print index($0,"amil")-1}'<<< "α-amilase"    
2

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

如果没有找到匹配项,则打印-1。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41718261

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档