具有多行模式空间的 sed 的 ^ 和 $ 正则表达式锚点的 POSIX 行为

use*_*102 5 sed text-processing posix regular-expression

如果模式空间包含嵌入的换行符,例如在使用N命令之后,在正则表达式的开头和结尾使用sed ^$锚点的 POSIX 行为是什么?

它们应该仍然匹配模式空间的开头和结尾,还是应该匹配包含多行的任何行的开头和结尾?

GNUsed^and$仍然只匹配整个模式空间的开头和结尾。

cuo*_*glm 3

^BRE$中,始终在行的开头和结尾匹配如此处所述

任何sed使用BRE的人都会这样做。在使用命令的情况下Nsed将多行视为模式空间中的一长行,每行由嵌入的换行符\n(文字\和)分隔n

确认:

printf '1\n2\n' | sed '1N;/2$/d'
Run Code Online (Sandbox Code Playgroud)

什么也不输出。和:

printf '1\n2\n' | sed '1N;/1$/d'
Run Code Online (Sandbox Code Playgroud)

给你:

1
2
Run Code Online (Sandbox Code Playgroud)

或者使用look 命令来获得更详细的信息:

$ printf '1\n2\n' | sed 1N\;l
1\n2$
1
2

$ printf '1\n2\n' | sed 1N\;l | od -t a
0000000   1   \   n   2   $  nl   1  nl   2  nl
0000012
Run Code Online (Sandbox Code Playgroud)