我想在一定范围内但以相反的顺序搜索模式。例如,如果我给出的范围说我给出的范围是 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