不要用 sed 打印不匹配的文本

mik*_*ike 2 linux sed

我只想打印匹配的行并删除不匹配的行,但具有以下内容:

$ echo test12 test  | sed -n 's/^.*12/**/p'
Run Code Online (Sandbox Code Playgroud)

我总是得到:

** test
Run Code Online (Sandbox Code Playgroud)

代替:

**
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?

[编辑1]

我提供了更多我需要的信息——实际上我应该从它开始。因此,我有一个命令产生大量输出行,我只想抓取部分行 - 匹配的行,并剥离结果。因此,在上面的示例中,12 是为了查找该行的匹配部分的结尾,而不是 ** 我应该放置 & 来表示匹配的字符串。所以完整的例子是:

echo test12 test  | sed -n 's/^.*12/&/p'
Run Code Online (Sandbox Code Playgroud)

它产生与输入完全相同的输出:

test12 test
Run Code Online (Sandbox Code Playgroud)

预期输出是:

test12
Run Code Online (Sandbox Code Playgroud)

按照建议,我开始寻找 grep 替代方案,以下内容看起来很有希望:

$ echo test12 test  | grep -Eo "^.*12"
Run Code Online (Sandbox Code Playgroud)

但我不知道如何格式化匹配的部分,这只会删除不匹配的文本。

Phi*_*ark 5

编辑:在某些情况下,sed 可能需要 -E 标志。但这样就不需要再转义括号了。检查 sed 的手册页。

我想你正在寻找的是这样的:

echo test12 test  | sed -n 's/^\(.*12\).*$/\1/p'
Run Code Online (Sandbox Code Playgroud)

如果您想丢弃该行的其余部分,则还必须匹配它,但不要将其包含在输出中。和\(表示\)随后由 引用的组\1

祝你好运 :)

有关 sed 的附加信息:sed 在行上工作,& 字符表示与给定正则表达式匹配的整行。如果正则表达式在末尾是“开放”的(即不以结束符 ( $) 结尾,则它的作用就好像.*$附加到匹配字符串中一样。(不确定这是否是它的实现方式,但很可能是.)