【发布时间】:2021-12-15 22:54:51
【问题描述】:
我们有以下一行文字:
|  |  |  |
如您所见,文本行仅由三个相似的短语组成,可以使用以下 sed 表达式(单独)匹配和更改:
sed -n 's@| !\[.*\](\(\/img\/\)\([0-9]*\/[0-9]*\/[0-9]*\)\.\(.*\)\.\(.*\)) |@|  |@p'
如果我们只有一个短语(而不是给定的三个),结果将如下:
$ echo '|  |' | sed -n 's@| !\[.*\](\(\/img\/\)\([0-9]*\/[0-9]*\/[0-9]*\)\.\(.*\)\.\(.*\)) |@|  |@p'
|  |
但是当我们有两个或你的短语时,结果总是指向最后一个匹配的短语:
这里有两个匹配的例子:
$ echo '|  |  |' | sed -n 's@| !\[.*\](\(\/img\/\)\([0-9]*\/[0-9]*\/[0-9]*\)\.\(.*\)\.\(.*\)) |@|  |@p'
|  |
这是一个包含三个匹配项的示例:
$ echo '|  |  |  |' | sed -n 's@| !\[.*\](\(\/img\/\)\([0-9]*\/[0-9]*\/[0-9]*\)\.\(.*\)\.\(.*\)) |@|  |@p'
|  |
为什么会这样?
有没有办法强制 sed 只打印第一个匹配的结果?
预期的行为?我虽然下面的命令会打印出类似的东西(只是第一个匹配):
$ echo '|  |  |  |' | sed -n 's@| !\[.*\](\(\/img\/\)\([0-9]*\/[0-9]*\/[0-9]*\)\.\(.*\)\.\(.*\)) |@|  |@p'
|  |
或者这个(所有匹配):
$ echo '|  |  |  |' | sed -n 's@| !\[.*\](\(\/img\/\)\([0-9]*\/[0-9]*\/[0-9]*\)\.\(.*\)\.\(.*\)) |@|  |@p'
|  |  |  |
【问题讨论】:
标签: sed backreference