尝试在指定字符串后进行 grep

Trying to grep after a specified string

所以我有一个包含电子书合集的大文件,每本都带有 Title: The Book Title (That may-contain 'special_characters) 这样的标签。我有以下 grep 命令来匹配 Title: 字符串之后的所有内容以及 space 以获取所有书名:

grep -P -o '(?<=^Title:\s).*' ebooks_full.txt

但它不起作用并返回一堆空行。有什么建议吗?

您的电子书中有 Windows 行结尾,因此每个匹配项都以 CR 结尾。在 Linux 上,这将有效地导致打印该行然后立即将其删除,因此您不会在输出中看到它。

简单的解决方案:从匹配项中删除 CR

grep -P -o '(?<=^Title:\s)[^\r]*' ebooks_full.txt

替代解决方案:告诉 grep 不要对输出进行着色:

grep --color=no -P -o '(?<=^Title:\s).*' ebooks_full.txt

(但是,这会保留 CR,因此如果您想将输出捕获到文件中,请使用第一个解决方案。)

更好的技术解释:CR(回车return)导致光标移动到行首。 grep -o(当它以彩色输出时)在每行的末尾放置一个 ESC [ K 序列,这会将屏幕擦除到该行的末尾。