2015-01-24 4 views
0

Итак, у меня есть большой файл с коллекционными электронными книгами, каждый с надписью Title: The Book Title (That may-contain 'special_characters). У меня есть следующий Grep команда для того, чтобы соответствовать всем после Title: строки вместе с протекающим пространством, чтобы получить все названия книги:Попытка grep после указанной строки

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

Но это не работает, и возвращает кучу пустых строк. Какие-либо предложения?

+1

У вас есть образец данных, генерирующих это поведение? Ваша команда 'grep' отлично подходит для меня с единственным образцом, указанным в вопросе. – rchang

ответ

2

У вас есть окончание строк Windows в ваших электронных книгах, поэтому каждый матч заканчивается CR. В Linux это приведет к тому, что строка будет напечатана, а затем сразу же удалена, поэтому вы не увидите ее на своем выходе.

Простое решение: исключить CR от матча:

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

Альтернативное решение: сказать grep не Colorise выход:

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

(Тем не менее, что оставит АСБ на месте, поэтому используйте первое решение, если вы хотите записать вывод в файл.)

Лучшее техническое объяснение: CR (возврат каретки) заставляет курсор перемещаться в начало строки. grep -o (когда он выводится цветом) помещает в конец каждой строки последовательность ESC [ K, которая стирает экран до конца строки.

+0

Это работает. Спасибо! – BrandonM

+0

Sharp eye - я нередко сразу вспоминаю капризы перемещения данных между платформами Windows и Linux. :) – rchang

Смежные вопросы