如何在行号前使用模式来获取一行?

如何在行号前使用模式来获取一行?

我需要获取文件某个行号之前与模式匹配的一行。

例子:

linenum 1.fruits
linenum 2.cherry
linenum 3.apple
.
.
linenum 7.orange
linenum 8.apple2
.
.
.
linenum 20.strawberry

从上面的文件中,我想要第 8 行。我知道它会出现在第 20 行之上,并且我知道该行包含apple

答案1

这是一个使用的解决方案sed

sed -n '20,$d;/apple/h;19{x;p}'
  • -n- 禁止打印线条
  • 20,$d20- 对于从到文件末尾 ( )的任何行$,删除 ( d) 它
  • /apple/h- 对于与正则表达式匹配的任何行/apple/,将其复制到“保持空间“(h
  • 19{x;p}- 在线19,交换模式并保持空间(x)并打印模式空间(p

19请注意,最终打印时必须使用 line ,因为此后的所有行都将被删除。否则,您可以使用“最后一行“ 地址 - $


在这个测试中,我在第 23 行添加了一个apple

$ sed -n '20,$d;/apple/h;19{x;p}' < file
linenum 8.apple2

答案2

尽管标签是,我的答案没有用sed

以下命令获取前 19 行,丢弃没有 的行apple,然后返回剩余的最后一行:

head -n 19 | grep "apple" | tail -n 1

要处理名为的文件file.txt

<file.txt head -n 19 | grep "apple" | tail -n 1

答案3

与已经发布的解决方案相同,这次使用 Perl:

perl -lane 'if(1..19 and /apple/){$a=$_} END{print $a}' input.txt

和 AWK:

awk 'NR<20 && /apple/ {a=$0} END{print a}' input.txt

相关内容