我只想打印匹配的行并删除不匹配的行,但具有以下内容:
$ 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)
但我不知道如何格式化匹配的部分,这只会删除不匹配的文本。
编辑:在某些情况下,sed 可能需要 -E 标志。但这样就不需要再转义括号了。检查 sed 的手册页。
我想你正在寻找的是这样的:
echo test12 test | sed -n 's/^\(.*12\).*$/\1/p'
Run Code Online (Sandbox Code Playgroud)
如果您想丢弃该行的其余部分,则还必须匹配它,但不要将其包含在输出中。和\(表示\)随后由 引用的组\1。
祝你好运 :)
有关 sed 的附加信息:sed 在行上工作,& 字符表示与给定正则表达式匹配的整行。如果正则表达式在末尾是“开放”的(即不以结束符 ( $) 结尾,则它的作用就好像.*$附加到匹配字符串中一样。(不确定这是否是它的实现方式,但很可能是.)