如何在两个相同的标记模式之间获取特定数据

Posted

技术标签:

【中文标题】如何在两个相同的标记模式之间获取特定数据【英文标题】:How to get particular data between two same marker patterns 【发布时间】:2016-05-13 16:31:17 【问题描述】:

使用 awk 或 sed ,我如何选择出现在两个相同标记模式之间的行?可能有多个部分标有这些模式。

例如:假设文件包含:

$$$
lines between dollar and AT
@@@
lines between first and second AT
@@@
lines between second and third AT
@@@
lines between third and fourth AT
@@@

使用

cat 2.txt | sed -n '/$$$/,/@@@/p'

我得到了 $$$ 和第一次出现 @@@ 之间的内容。

我的疑问是,如何在 第一次和第三次出现 @@@

之间获取内容

预期输出是:

lines between first and second AT
@@@
lines between second and third AT

【问题讨论】:

添加计数器,检查计数器,如果counter=value,打印数据 开始:awk '/@@@/ cnt+=1 cnt; cnt==3exit' input.txt 也许还可以在 Fredrik Pihl 评论中添加以下内容,即刮掉第一行和最后一行...awk '/@@@/ cnt+=1 cnt; cnt==3exit' sed_sample.txt | sed -e '1,1d' -e '$d' 【参考方案1】:

awk 似乎是完成这项工作的更明智的工具,主要是因为它允许您比 sed 更容易地在命令行上指定参数(也就是说,根本没有),并且因为它可以明智地处理数字。

我会使用

awk -v pattern='^@@@$' -v first=1 -v last=3 '$0 ~ pattern  ++count; if(count == first) next  count == last  exit  count >= first' 2.txt

它的工作原理如下:

$0 ~ pattern               # When the delimiter pattern is found:
  ++count                   # increase counter.
  if(count == first)       # If we found the starting pattern
    next                    # skip to next line. This handles the fencepost.
  

count == last              # If we found the end pattern, stop processing.
  exit

count >= first              # Otherwise, if the line comes after the starting
                            # pattern, print the line.

【讨论】:

以上是关于如何在两个相同的标记模式之间获取特定数据的主要内容,如果未能解决你的问题,请参考以下文章

如何从另一个模式中获取特定的键值,通过比较它们是不是具有相同的键值?

如何在 MySQL 中的两个日期之间获取特定日期

如何选择可能使用 awk/sed 多次出现的两个标记模式之间的行

比较与特定字段有关的两个表之间的差异时如何正确连接

如何通过 SQL 语句从两个特定日期(由用户指定)之间的数据库表中获取数据?

如何在jQuery中的两个字符串之间获取url的特定部分[重复]