我想只打印匹配的行并剥离不匹配的行,但需要注意以下内容:
$ echo test12 test | sed -n 's/^.*12/**/p'
我总是得到:
** test
而不是:
**
我做错了什么?
[EDIT1]
我提供了更多我需要的信息 - 实际上我应该从中开始。所以,我有一个产生大量输出行的命令,我想只抓取部分行 - 匹配的行,并删除结果。所以在上面的例子中,12意味着要找到该行的匹配部分的结尾,而不是**我应该放置&表示匹配的字符串。所以完整的例子是:
echo test12 test | sed -n 's/^.*12/&/p'
产生与输入完全相同的输出:
test12 test
预期输出为:
test12
正如所建议的那样,我开始寻找一个grep替代品,以下内容看起来很有希望:
$ echo test12 test | grep -Eo "^.*12"
但是我没看到如何格式化匹配的部分,这只会剥离不匹配的文本。
答案 0 :(得分:3)
编辑:在某些情况下,sed可能需要-E标志。但是,括号不再需要转义。检查你的sed的手册页。
我认为你在寻找的是:
echo test12 test | sed -n 's/^\(.*12\).*$/\1/p'
如果要丢弃该行的其余部分,则必须匹配它,但不要将其包含在输出中。 \(
和\)
表示由\1
引用的组。
有关sed的其他信息:
sed适用于行,而&符号表示由给定正则表达式匹配的整行。如果正则表达式在结尾处是“开放”(即不以结束字符($
)结尾,则表现为.*$
附加到匹配字符串。(不确定是否是如何实施,但很可能。)
答案 1 :(得分:1)
尝试:
echo test12 test | sed -n 's/^.*/**/p'
你不需要匹配12号,因为你的正则表达式已经完成了。
答案 2 :(得分:1)
您的正则表达式匹配从行开头到表达式' 12'的任何内容。所有匹配的表达式都替换为' **',这就是为什么你得到了'** test'。如果你只想匹配,我建议你使用grep。