gpt4 book ai didi

sed - 如何使用 sed 提取除最后一行以外的正则表达式分隔范围?

转载 作者:行者123 更新时间:2023-12-01 09:10:11 28 4
gpt4 key购买 nike

一个简单的 sed 表达式从文本文件中提取由正则表达式分隔的行 block ,如下所示:

$ sed -n -e '/start-regex/,/end-regex/ p' input_file

这会选择从匹配 start-regex 的行开始并包括匹配 end-regex 的行。

匹配 end-regex 的行可能会像这样被排除:

$ sed -n -e '/start-regex/,/end-regex/ {/end-regex/d;p}

是否可以在不重复 end-regex 的情况下执行此操作?

如果可以省略最后一行,那么是否也可以省略第一行和/或最后一行而不重复正则表达式?

提出这个问题的原因是为了找到一种比重复复杂且难以阅读的表达式更有效的解决问题的方法。

这个问题是关于sed,特别是关于它的一个实例。可能有一些方法可以使用 headtailawk 等管道来做到这一点,但问题是这是否可以使用

有许多类似的问题,但它们要求针对特定用例的解决方案,而不是从源头上处理一般问题。

任何解决方案都应该适用于 GNU sed。

最佳答案

切勿正是出于这个原因使用范围(考虑到最轻微的需求变化,它们需要重写或复制条件)。改用标志:

awk '/start/{f=1} /end/{f=0} f' file

这意味着您不能使用 sed 以任何简洁、可移植的方式执行此操作(在 GNU sed 中可能会有一些奇怪的单字符 rune 组合可以执行您想要的操作,但如果您认为重复条件是 复杂且难以阅读 等等,直到你看到它!),你需要一个像 awk 这样支持变量的工具。使用上述方法,您只需重新排列脚本的 3 个部分,就可以从所有分隔符打印到没有分隔符(添加 {print} 只是为了清楚起见,而不是依赖默认行为):

$ seq 1 10 | awk '/3/{f=1} f{print} /7/{f=0}'
3
4
5
6
7

$ seq 1 10 | awk 'f{print} /3/{f=1} /7/{f=0}'
4
5
6
7

$ seq 1 10 | awk '/3/{f=1} /7/{f=0} f{print}'
3
4
5
6

$ seq 1 10 | awk '/7/{f=0} f{print} /3/{f=1}'
4
5
6

关于sed - 如何使用 sed 提取除最后一行以外的正则表达式分隔范围?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39036889/

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