使用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
相关产品推荐
相关产品推荐

