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

时间:2017-08-07 16:18:10

标签: linux sed

我想只打印匹配的行并剥离不匹配的行,但需要注意以下内容:

$ 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"

但是我没看到如何格式化匹配的部分,这只会剥离不匹配的文本。

3 个答案:

答案 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。