尝试在指定字符串后进行 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
序列,这会将屏幕擦除到该行的末尾。
所以我有一个包含电子书合集的大文件,每本都带有 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
序列,这会将屏幕擦除到该行的末尾。