文件的输出行,由行号指定,只有bash(没有sed、grep或awk)

文件的输出行,由行号指定,只有bash(没有sed、grep或awk),bash,shell,Bash,Shell,在不使用诸如sed、grep或awk等工具的情况下,仅使用标准shell,我需要检索包含模式的行号,然后针对检索到的每个行号,输出行: [(line_retrieved) + 1 - (line_retrieved % 6)] to [line_retrieved + 6] 跳过重复的行块时 我能够输出一个文件的行,由sed“${START\u line},${END\u line}”文件的行号指定。我还没有找到如何检索包含模式的行的行号。给你 假设您的模式是“giga.*”(例如,如果您想捕

在不使用诸如
sed
grep
awk
等工具的情况下,仅使用标准shell,我需要检索包含模式的行号,然后针对检索到的每个行号,输出行:

[(line_retrieved) + 1 - (line_retrieved % 6)] to [line_retrieved + 6]
跳过重复的行块时

我能够输出一个文件的行,由
sed“${START\u line},${END\u line}”文件的行号指定。我还没有找到如何检索包含模式的行的行号。

给你

假设您的模式是“giga.*”(例如,如果您想捕获“gigaks”),文件是/tmp/1.txt,那么您可以执行以下操作:

你会做:

 pattern="giga.*"; linenum=1; while read line; do for word in `echo $line`; do if [[ "$word" =~ "$string_to_search" ]]; then echo $linenum:$line; fi; done; ((linenum++)); done < /tmp/1.txt | sort -u
pattern=“giga.*”;linenum=1;读行时;“echo$行”中的单词do;如果[[“$word”=~“$string_to_search”]执行此操作;然后echo$linenum:$line;fi;完成;((linenum++);完成
概述:
1) 我在
pattern
变量中设置模式。值可以是精确的字符串或实际模式

2) 在外循环中逐行读取文件,并将整行读取到变量$line中

3) 然后你读整行,把这行中的所有单词读成一个变量$word

4) 然后将IF语句与
=~
SHELL级别的直接正则表达式匹配(使用=~运算符)

5) 如果第4条语句为true,则回显$linenum(包含行#)和整个$line

6) 每运行一次外部循环(即每行)可以增加$linenum

7)
sort-u
仅用于在一行字中出现一次以上的模式/字符串时打印该行一次

它将以整行显示所有模式,并以文件中每行的行#作为前缀


注意:如果您想执行
grep-i
(忽略大小写),那么您可以尝试实际的grep-i或类似功能。

…为什么有这些限制?这些都是…非常罕见的,值得解释。请指定什么样的模式,以及一组重复块可能有多少行。还显示一些示例输入和所需输出。除了复制块的内容外,听起来目标似乎是在
bash
中模拟
grep-c6模式。如果是这样的话,
%6
应该是
-6
。现在,这听起来像是“请为我做家庭作业”,而不是关于编写自己的代码时遇到的特定问题的问题。为了避免给人留下这样的印象,展示你的作品是一个很好的开始。顺便说一句,如果你还想知道如何开始(就创建一些你可以展示的作品而言),请参阅(我如何逐行(和/或逐字段)读取文件(数据流、变量)?)以明确,你在做家庭作业时遇到的问题在这里可能是完全有效的——请参阅,以获取如何提问一个广受欢迎的问题的指导。关键是,这应该是一个关于现有实现中的特定问题的问题,是在自己真诚地努力解决问题之后提出的。不,这有一些常见问题。“试着诊断出很多。”特里皮在我这边工作得很好。你能分享什么问题吗?你清楚地用(太)不具挑战性的测试数据进行了测试。再次尝试详细的诊断。