通过模式获取第n个范围

发布于 2024-10-18 05:12:49 字数 235 浏览 3 评论 0原文

我的输入是这样的:

start
content A
end
garbage
start
content B
end

我想提取第二个(或第一个,或第三个...)start .. end块。有了

sed -ne '/start/,/end/p'

我可以过滤掉垃圾,但是我如何得到“开始内容B结束”?

My input is like this:

start
content A
end
garbage
start
content B
end

I want to extract the second (or first, or third ...) start .. end block. With

sed -ne '/start/,/end/p'

I can filter out the garbage, but how do I get just "start content B end"?

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

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

发布评论

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

评论(2

何止钟意 2024-10-25 05:12:49

但无论如何,如果你想要 sed - 你会得到 sed:)

/^start$/{
  x
  s/^/a/
  /^aaa$/{
    x
    :loop
    p
    /^end$/q
    n
    bloop
  }
  x
}

中间匹配中 a 的数量等于你想要获得的段。您也可以像丹尼斯指出的那样在正则表达式中重复它。该方法允许为脚本指定直接编号。

注意:该脚本应使用 -n sed 选项运行。

But anyway, if you want sed - you get sed:)

/^start$/{
  x
  s/^/a/
  /^aaa$/{
    x
    :loop
    p
    /^end$/q
    n
    bloop
  }
  x
}

The number of a's in the middle match equals to which segment you want to get. You could also have it in regexp repetion like Dennis noted. That approach allows for specifying direct number to the script.

Note: the script should be run with -n sed option.

初雪 2024-10-25 05:12:49

获取所有范围

$ awk 'BEGIN{RS="end";FS="start"}{ print $NF}' file

content A


content B

获取第二个范围

$ awk 'BEGIN{RS="end";FS="start"}{c++; if (c==2) print $NF}' file

content B

Ruby(1.9+),获取第一个范围

$ ruby -0777 -ne 'puts $_.scan(/start(.*?)end/m)[0]' file

content A

Get all range

$ awk 'BEGIN{RS="end";FS="start"}{ print $NF}' file

content A


content B

Get 2nd range

$ awk 'BEGIN{RS="end";FS="start"}{c++; if (c==2) print $NF}' file

content B

Ruby(1.9+), get first range

$ ruby -0777 -ne 'puts $_.scan(/start(.*?)end/m)[0]' file

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