Re: [问题] sed , grep 匹配问题

楼主: DarkKiller (System hacked)   2020-02-24 23:43:33
你的问题是 GNU 的实做问题,如下。
※ 引述《ericshei (ericshei)》之铭言:
: 请教,我不理解为什么^..*,[1-9]*,\+在如下grep , sed的结果是match的?
: $ echo '11162,1,2020-02-17 19:59:31:696,+000000000 00:01:39.097' | grep '^..*,[1-9]*,\+'
: 11162,1,2020-02-17 19:59:31:696,+000000000 00:01:39.097
我没翻到 2.20 的 manual,但这是 2.16 的 grep:
https://manpages.ubuntu.com/manpages/trusty/man1/grep.1.html
Basic vs Extended Regular Expressions
In basic regular expressions the meta-characters ?, +, {, |,
(, and ) lose their special meaning; instead use the backslashed
versions \?, \+, \{, \|, \(, and \).
这是 2.24 的 grep:
https://manpages.ubuntu.com/manpages/xenial/man1/grep.1.html
Basic vs Extended Regular Expressions
In basic regular expressions the meta-characters ?, +, {, |,
(, and ) lose their special meaning; instead use the backslashed
versions \?, \+, \{, \|, \(, and \).
基本上是一样的,所以我猜 grep 2.20 也是一样的。
虽然 GNU grep 都是宣称实做 POSIX 的 Basic Regular Expressions (BRE),但
GNU grep 很鸡婆的加上了特殊的延伸。
所以这边的 ,\+ 的部份是一个或多个逗点的意思,所以会 match。
: $ echo '11162,1,2020-02-17 19:59:31:696,+000000000 00:01:39.097' | sed 's/^..*,[1-9]*,\+/REPLACED/g'
: REPLACED2020-02-17 19:59:31:696,+000000000 00:01:39.097
同样的道理,虽然 GNU sed 宣称也是 BRE,但 GNU sed 有自己实做了 GNU
extension:
https://www.gnu.org/software/sed/manual/html_node/Regular-Expressions.html
\+
As *, but matches one or more. It is a GNU extension.
所以后面的 ,\+ 的部份也是一个或多个的意思,所以 "11162,1," 被换掉了。
作者: ericshei (ericshei)   2020-02-26 09:54:00
非常感谢您的说明

Links booklink

Contact Us: admin [ a t ] ucptt.com