You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用grep或类似工具获取文本模式的起始索引(索引从0开始)

Shell命令:查找文本文件中指定模式的起始索引(从0开始)

我来给你分享一个能完美满足需求的Shell方案,用awk就能轻松实现从0开始的全局索引查找,还能自动把多个匹配结果用逗号+空格分隔输出。

实现脚本

你可以把下面的代码保存成一个可执行脚本(比如find_index.sh),或者直接用单行命令执行:

#!/bin/bash
# 用法:./find_index.sh <目标文件名> <要搜索的模式>
awk -v pattern="$2" 'BEGIN{start=0; start_in_line=0} {
    current_line = $0
    # 在当前未处理的行片段中循环查找匹配
    while (match(substr(current_line, start_in_line+1), pattern)) {
        # 计算全局索引:已处理的总长度 + 匹配位置(从1开始) - 1
        global_idx = start + RSTART - 1
        # 收集结果,多个结果用逗号分隔
        results = results (results == "" ? "" : ", ") global_idx
        # 更新当前行内的起始位置,避免重复匹配同一位置
        start_in_line += RSTART + RLENGTH - 1
    }
    # 更新全局已处理长度:加上当前行长度 + 换行符(占1个字符)
    start += length(current_line) + 1
    # 重置行内起始位置,处理下一行
    start_in_line = 0
} END{
    # 最终输出所有匹配的索引,无匹配时提示
    print (results == "" ? "未找到匹配" : results)
}' "$1"

给脚本加执行权限

如果保存成脚本的话,记得先添加执行权限:

chmod +x find_index.sh

使用示例

假设你的test.txt内容是:

hello world

(注:这里的换行符会被当作普通字符计入全局索引)

示例1:查找"world"的起始索引

./find_index.sh test.txt world

输出:

6

示例2:查找"o"的所有起始索引

./find_index.sh test.txt o

输出:

4, 7

额外说明

  • 支持正则表达式:默认情况下,搜索模式会被当作正则表达式处理。如果需要精确匹配字符串(比如模式里包含.、*这类正则元字符),可以把-v pattern="$2"改成-v pattern="\\Q$2\\E",这样就能转义所有正则特殊字符。
  • 跨多行匹配:这个脚本会把整个文件当作连续的字符流(包括换行符),所以即使模式跨多行也能正确计算全局索引。
  • 自定义无匹配提示:如果不需要“未找到匹配”的提示,直接把END块里的代码改成print results即可,无匹配时会输出空行。

内容的提问来源于stack exchange,提问作者lsund

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 06:44:37