sed 记住了模式输出,没有返回我期望的任何内容



>我有以下字符串:

"date" : dateFunc("2019-12-01T00:00:00Z")

当我尝试使用 sed 获取任何反向引用时,我没有得到我认为应该得到的东西。

例如,这就是显示我是否使用相同的正则表达式egrep -o的内容:

$ echo '"date" : dateFunc("2019-12-01T00:00:00Z")' | egrep -o '(" : )'
" : 
$ echo '"date" : dateFunc("2019-12-01T00:00:00Z")' | egrep -o '(" : )(dateFunc)'
" : dateFunc
$ echo '"date" : dateFunc("2019-12-01T00:00:00Z")' | egrep -o '(" : )(dateFunc)([(])'
" : dateFunc(

现在,如果我在 sed 中应用相同的正则表达式,我期望以下内容:

1生产" :

2生产dateFunc

3生产(

但是,我得到的是以下内容:

$ echo '"date" : dateFunc("2019-12-01T00:00:00Z")' | sed -r 's/(" : )(dateFunc)([(])/1/g'
"date" : "2019-12-01T00:00:00Z")
$ echo '"date" : dateFunc("2019-12-01T00:00:00Z")' | sed -r 's/(" : )(dateFunc)([(])/2/g'
"datedateFunc"2019-12-01T00:00:00Z")
$ echo '"date" : dateFunc("2019-12-01T00:00:00Z")' | sed -r 's/(" : )(dateFunc)([(])/3/g'
"date("2019-12-01T00:00:00Z")

这是匹配的:

"date" : dateFunc("2019-12-01T00:00:00Z")
1:       ~~~~
2:           ~~~~~~~~  
3:                   ~

这就是替换的工作方式(我用_替换了空格,其余空格只是为了显示对齐方式(:

"date" : dateFunc("2019-12-01T00:00:00Z")
~~~~~~~~~~~~~
1: "date"_:_         "2019-12-01T00:00:00Z")
2: "date    dateFunc "2019-12-01T00:00:00Z")
3: "date            ("2019-12-01T00:00:00Z")

因此,sed 返回的正是您要求它返回的内容。

sed 仅替换匹配的部分,而grep -o显示它们。也许你想要

sed -r 's/.*(" : )(dateFunc)([(]).*/1/g'
~~                     ~~
^                       ^
|                       |
Match anything           Match anything
before                   after

最新更新