首页 > 解决方案 > 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")

标签: regexbashsed

解决方案


这是匹配的:

    "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

推荐阅读