gpt4 book ai didi

bash - 使用 grep 的字符偏移

转载 作者:行者123 更新时间:2023-11-29 09:25:20 27 4
gpt4 key购买 nike

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

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

我明白了:

3:amilase

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

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

但是我怎样才能得到字符偏移量,在这种情况下是 2?为什么是2?如果您看着屏幕并数一数在匹配词之前存在多少个可见符号,您会数到 2。

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

最佳答案

您可以启动您自己的穷人的 grep!

把它放在一个名为 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 开始)括号内的子表达式。

关于bash - 使用 grep 的字符偏移,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41718261/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com