gpt4 book ai didi

bash - 提取两个模式之间的线并包括第一个上方和第二个下方的线

转载 作者:行者123 更新时间:2023-11-29 09:23:37 25 4
gpt4 key购买 nike

有以下文本文件,我需要提取和打印两个模式之间的字符串,还包括第一个模式上方的行和第二个模式之后的行

asdgs sdagasdg sdagdsag
asdfgsdagg gsfagsaf
asdfsdaf dsafsdfdsfas
asdfdasfadf
nnnn nnnnn aaaaa
line before first pattern
***** FIRST *****
dddd ffff cccc
wwww rrrrrrrr xxxx
***** SECOND *****
line after second pattern
asdfgsdagg gsfagsaf
asdfsdaf dsafsdfdsfas
asdfdasfadf
nnnn nnnnn aaaaa

我已经找到了许多使用 sed 和 awk 在两个标签之间提取的解决方案,如下所示

sed -n '/FIRST/,/SECOND/p' FileName

但是如何在模式前后包含行呢?

期望的输出:

line before first pattern
***** FIRST *****
dddd ffff cccc
wwww rrrrrrrr xxxx
***** SECOND *****
line after second pattern

最佳答案

正如您要求的 sed/awk 解决方案(每个人都害怕 ed ;-),这是您的一种方式可以在 awk 中完成:

awk '/FIRST/{print p; f=1} {p=$0} /SECOND/{c=1} f; c--==0{f=0}' file

当匹配到第一个模式时,打印上一行p并设置打印标志f。当匹配到第二个模式时,将 c 设置为 1。如果 f 为 1(真),将打印当前行。 c--==0 仅在第二个模式匹配后的行为真。

另一种方法是遍历文件两次:

awk 'NR==FNR{if(/FIRST/)s=NR;else if(/SECOND/)e=NR;next}FNR>=s-1&&FNR<=e+1' file file

第一次遍历文件循环遍历文件并记录行号。第二个打印范围内的行。

第二种方法的优点是打印范围前 M 行和范围后 N 行非常简单,只需更改脚本中的数字即可。

要使用 shell 变量而不是硬编码模式,您可以像这样传递变量:

awk -v first="$first" -v second="$second" '...' file

然后使用 $0 ~ first 而不是 /FIRST/

关于bash - 提取两个模式之间的线并包括第一个上方和第二个下方的线,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29967395/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com