作者DarkKiller (System hacked)
看板RegExp
标题Re: [问题] sed , grep 匹配问题
时间Mon Feb 24 23:43:33 2020
你的问题是 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," 被换掉了。
--
Resistance is futile.
https://blog.gslin.org/ & <
[email protected]>
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 122.116.104.21 (台湾)
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/RegExp/M.1582559019.A.A93.html
1F:推 ericshei: 非常感谢您的说明 02/26 09:54