我正在阅读GNU sed 中的范围地址。但我不明白它到底是如何工作的,我试图运行sed --debug
但输出太冗长而无法理解。
假设我有以下文件input.txt
:
===sep1
Aghroum
===sep2
Thirjeen
===sep3
Ya wedi mata ikinikh
===sep4
Ifoullissen
===sep5
当我尝试如下使用范围地址时:
sed -n '/=/,/=/{/=\|^$/! p}' input.txt
输出是:
# it prints non-empty lines from ===sep1 to ==sep2, and from ===sep3 to ==sep4, etc.
Aghroum
Ya wedi mata ikinikh
据我所知,GNU sed 逐行处理输入文件,为什么它也不匹配to之间的范围地址?(请注意,我不是在问如何获取这些行,我知道如何使用类似的东西来做到这一点。但我问的是为什么它不从to开始第二个范围地址)==sep2
==sep3
sed -n '/===/!p'
===sep2
===sep3
谢谢
sed
将按照要求执行并按照命令中的说明匹配 from=
to=
sed
一次读取每一行。这意味着当找到范围的结尾时,它也不会将该结束范围包括为起始范围。考虑一下;
范围将始终匹配
Aghroum
,因为它已经到达范围匹配以及文件的末尾。包含文件的其余部分;
匹配再次开始,这次从 value 的行开始,
sep03
直到范围内的下一个匹配=
将输出Ya wedi mata ikinikh
。由于此后只有一个匹配且范围没有结束,因此在该范围内没有其他匹配项,因此匹配退出
此行为在 POSIX的
sed
规范中进行了解释:一旦找到一个范围,下一个范围最早只能从该范围之后的行开始。
换句话说,范围内的结束匹配“消耗”了它匹配的行;该行无法启动同一范围的另一个实例。