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

标签 linux sed

我只想打印匹配的行并去除不匹配的行,但要使用以下内容:

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

相关文章:

linux(CLI)通过共享保管箱(文件夹`)链接下载文件而无需帐户

python - 库只会加载 LD_PRELOAD

python - 在 Python 中捕获 SIGINT 以外的信号

regex - 如果一行以 = 结尾,则将下一行附加到它 (sed)

linux - 从 eclipse 将更改提交到 cvs

linux - 当 tar 找不到容器文件系统时 docker swarm create 失败

bash - 在 Bash 中按字母顺序排序

shell - 使用单行 shell 命令替换所有文件中的特定文本

linux - sed 用多行文件或变量替换行

shell - sed命令替换文件中的代码并保存