我只想打印匹配的行并去除不匹配的行,但要使用以下内容:
$ echo test12 test | sed -n 's/^.*12/**/p'
我总是得到:
** test
代替:
**
我做错了什么?
[编辑1]
我提供了更多我需要的信息——实际上我应该从它开始。所以,我有一个产生大量输出行的命令,我只想抓取部分行 - 匹配的行,然后去掉结果。所以在上面的例子中 12 是为了找到行的匹配部分的结尾,而不是 ** 我应该放 & 代表匹配的字符串。所以完整的例子是:
echo test12 test | sed -n 's/^.*12/&/p'
产生与输入完全相同的输出:
test12 test
预期的输出是:
test12
按照建议,我开始寻找 grep 替代方案,以下看起来很有希望:
$ echo test12 test | grep -Eo "^.*12"
但我不知道如何格式化匹配的部分,这只会去除不匹配的文本。
最佳答案
编辑:在某些情况下,sed 可能需要 -E 标志。但是这样就不需要再转义括号了。查看您的 sed 手册页。
我想你要找的是这个:
echo test12 test | sed -n 's/^\(.*12\).*$/\1/p'
如果你想丢弃该行的其余部分,你也必须匹配它,但不要将它包含在输出中。 \(
和 \)
表示随后由 \1
引用的组。
祝你好运:)
关于 sed 的附加信息:
sed 作用于行,& 字符表示与给定正则表达式匹配的整行。如果正则表达式在末尾是“开放的”(即不以末尾字符 ($
) 结尾),它的作用就好像 .*$
附加到匹配项字符串。(不确定这是否是它的实现方式,但很可能是。)
关于linux - 不要用 sed 打印不匹配的文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45551481/