gpt4 book ai didi

regex - sed提取两个字符串之间的文本

转载 作者:太空宇宙 更新时间:2023-11-04 03:53:54 24 4
gpt4 key购买 nike

请帮助我使用 sed。我有一个如下所示的文件。

START=A
xxxxx
xxxxx
END
START=A
xxxxx
xxxxx
END
START=A
xxxxx
xxxxx
END
START=B
xxxxx
xxxxx
END
START=A
xxxxx
xxxxx
END
START=C
xxxxx
xxxxx
END
START=A
xxxxx
xxxxx
END
START=D
xxxxx
xxxxx
END

我想获取 START=A, END 之间的文本。我使用了以下查询。

sed '/^START=A/, / ^END/!d' input_file

这里的问题是,我正在得到

START=A
xxxxx
xxxxx
END
START=D
xxxxx
xxxxx
END

而不是

START=A
xxxxx
xxxxx
END

Sed 贪婪地查找。

请帮我解决这个问题。

提前致谢。

我可以使用 AWK 来实现上述目的吗?

最佳答案

sed -n '/^START=A$/,/^END$/p' data

-n选项表示默认不打印;然后脚本会说“在包含 START=A 的行和下一个 END 之间进行打印。

您也可以使用 awk 来完成:

A pattern may consist of two patterns separated by a comma; in this case, the action is performed for all lines from an occurrence of the first pattern though an occurrence of the second.

(来自 Mac OS X 上的 man awk)。

awk '/^START=A$/,/^END$/ { print }' data

给出问题中数据文件的修改形式:

START=A
xxx01
xxx02
END
START=A
xxx03
xxx04
END
START=A
xxx05
xxx06
END
START=B
xxx07
xxx08
END
START=A
xxx09
xxx10
END
START=C
xxx11
xxx12
END
START=A
xxx13
xxx14
END
START=D
xxx15
xxx16
END

使用 GNU sed 或 Mac OS X (BSD) sed 以及使用 GNU awk 或 BSD awk 的输出是相同的:

START=A
xxx01
xxx02
END
START=A
xxx03
xxx04
END
START=A
xxx05
xxx06
END
START=A
xxx09
xxx10
END
START=A
xxx13
xxx14
END

请注意我如何修改数据文件,以便更轻松地查看打印的各个数据 block 来自文件中的位置。

如果您有不同的输出要求(例如“仅 START=A 和 END 之间的第一个 block ”,或“仅最后一个...”),那么您需要在问题中更清楚地阐明这一点。

关于regex - sed提取两个字符串之间的文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25424574/

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