使用sed在一定范围内以相反的顺序进行模式搜索并获取每个匹配的行号

使用sed在一定范围内以相反的顺序进行模式搜索并获取每个匹配的行号

我想在一定范围内但以相反的顺序搜索模式。例如,如果我给出的范围说我给出的范围是 2,8 那么我希望应该以相反的顺序执行搜索。我的意思是应该从第 8 行到第 2 行执行搜索,如果有任何行与模式匹配,则打印行号

假设我有一个像这样的输入文件..

Hello world
Hello Universe
Hello Universe
Hello Maths
Hello Physics
Hello Earth
Hello Universe
Hello Tennis
Hello God
Hello Teacher

所以文件中有 10 行。现在我想搜索第 8 行到第 2 行之间的输入 Hello Universe。因此输出应该是我们匹配的行号Hello Universe

所以根据上面的例子,输出应该是

7
3
2

我已经尝试过这个命令sed -n '!G;h;2,8{\|Hello Universe|=}' a.txt,但它实际上是按升序执行搜索的

我在互联网上搜索过,发现如果我们sed '1!G;h;$!d' a.txt这样做,它实际上会以相反的顺序打印文件。只是想修改此命令,以便它在每个模式匹配上以相反的顺序打印行号。

那么我该如何修改命令。请帮忙

答案1

假设您只想找到文本文件第 200 到 250 行中的匹配项,但是从250 和 200 之前,一个简单的解决方案是tac按相反顺序打印文件。然后,您可以使用grep -n来搜索您的模式并打印行号和一个小的 Perl 脚本,以将行号更改为原始文件中的正确行号。像这样的东西:

sed -n '200,250p' file | tac | grep -n "$pattern" | perl -pe 's/(^\d+)/251-$1/e'

如果我们创建一个测试文件:

printf 'Line number %d\n' {1..400} > file

然后21作为模式,我们应该得到第 210 到 219 行和 221 行:

$ sed -n '200,250p' file | tac | grep -n 21 | perl -pe 's/(^\d+)/251-$1/e'
221:Line number 221
219:Line number 219
218:Line number 218
217:Line number 217
216:Line number 216
215:Line number 215
214:Line number 214
213:Line number 213
212:Line number 212
211:Line number 211
210:Line number 210

相关内容