如何打印与具有特定图案的另一条线最接近的图案的线?

发布于 2024-09-14 04:52:40 字数 364 浏览 10 评论 0原文

我想找到最接近特定模式的模式。例如我想打印“yyyy:”下的“bbb=”(它是 bbb= 到 yyyy 最接近的行)。这是第 8 行。行号和顺序可能会改变,所以最好不要使用行号。

root# vi a
"a" 15 行

 1  ## xxxx:

 2  aaa=3

 3  bbb=4

 4  ccc=2

 5  ddd=1

 6  ## yyyy:

 7  aaa=1

 8  bbb=0

 9  ccc=3

10  ddd=3

11  ## zzzz:

12  aaa=1

13  bbb=1

14  ccc=1

15  ddd=1

您有使用 awk 或 grep 来实现此目的的想法吗?

I want to find a pattern which is nearest to a specific pattern. Such as I want to print "bbb=" which is under the "yyyy:" (it is the closest line with bbb= to yyyy). It is line 8. line numbers and the order might be changed so it is better not to use line numbers.

root# vi a
"a" 15 lines

 1  ## xxxx:

 2  aaa=3

 3  bbb=4

 4  ccc=2

 5  ddd=1

 6  ## yyyy:

 7  aaa=1

 8  bbb=0

 9  ccc=3

10  ddd=3

11  ## zzzz:

12  aaa=1

13  bbb=1

14  ccc=1

15  ddd=1

Do you have an idea using awk or grep for this purpose?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

鹤仙姿 2024-09-21 04:52:40

像这样的东西吗?

awk '/^## yyyy:/ { i = 1 }; i && /^bbb=/ { print; exit }'

或者上面的一行也可以匹配 if 吗?在这种情况下,也许:

awk '/^bbb=/ && !i { p=NR; s=$0 }; /^bbb=/ && i { print (NR-i < i-p) ? $0 : s; exit }; /^## yyyy:/ { i=NR }'

考虑到可能没有上一个或下一个条目:

/^bbb=/ && !i { p1 = NR; s1 = $0 }
/^bbb=/ &&  i { p2 = NR; s2 = $0; exit }
/^## yyyy:/ { i = NR }
END {
    if (p1 == 0)
        print s2
    else if (p2 == 0)
        print s1
    else
        print (i - p1 < p2 - i ? s1 : s2)
}

Something like this?

awk '/^## yyyy:/ { i = 1 }; i && /^bbb=/ { print; exit }'

Or can a line above also match if? In that case, perhaps:

awk '/^bbb=/ && !i { p=NR; s=$0 }; /^bbb=/ && i { print (NR-i < i-p) ? $0 : s; exit }; /^## yyyy:/ { i=NR }'

Taking into account that there might not be a previous or next entry:

/^bbb=/ && !i { p1 = NR; s1 = $0 }
/^bbb=/ &&  i { p2 = NR; s2 = $0; exit }
/^## yyyy:/ { i = NR }
END {
    if (p1 == 0)
        print s2
    else if (p2 == 0)
        print s1
    else
        print (i - p1 < p2 - i ? s1 : s2)
}
冷了相思 2024-09-21 04:52:40

使用 grep 既快速又肮脏:

grep -A 100 '##yyyy' filename | grep 'bbb='

Quick and dirty using grep:

grep -A 100 '##yyyy' filename | grep 'bbb='
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文