GREP между шаблонами на отдельные линии или отдельная линия

Я написал инструмент Perl именно для этой проблемы ключа, значения:

Объединение правильных строк в пары: любое количество файлы . Он также доступен на GitHub .

Чтобы выполнить его, введите:

merge -k -e "-" jointest1.txt jointest2.txt

3
02.01.2019, 01:05
3 ответа

Если вы хотите, чтобы строки обрабатывались отдельно (в вашем первом примере ), но чтобы несколько совпадений в строке выводились в одну строку (, как во втором примере ), я не думаю, что это возможно только с grep.

Однако, используя тот же This.*?dayне -жадный поиск в perl, вы можете

$ perl -lne 'print join " ", /This.*?day/g' theabovetext1
This will be this one day
This will be this next day
This will won' not this day
This not what shoes day

, а для однострочного ввода -

$ perl -lne 'print join " ", /This.*?day/g' theabovetext2
This will be this one day This will be this next day This will won' not this day This not what shoes day
3
27.01.2020, 21:12

С помощью GNU grepвы можете сделать следующее:

grep -o 'This.*day' theabovetext

(обратите внимание, что вам не нужно cat, так как grepумеет читать файлы)

Флаг -oпоказывает только те части строки, которые соответствуют шаблону.

Я подозреваю, что другие версии grepтакже поддерживают этот флаг, но его нет в POSIX, поэтому он не обязательно переносимый.

4
27.01.2020, 21:12

Ответ Эрика Ренуфа делает большую часть работы. А комментарий steeldriver вырезает лишний текст в заданной строке, делая ее не-жадной.

Таким образом, похоже, что:grep -oP 'This.*?day' theabovetextделает все, что вы хотите, за исключением того, что вывод находится в нескольких строках.

Чтобы поместить вывод в одну строку, вы можете сделать grep -oP 'This.*?day' theabovetext | tr '\n' ' '. Это дополнение просто заменяет разрывы строк пробелами *

.

*Это заменит все выходные символы новой строки пробелами. Поэтому, если ваш первоначальный ввод разделен строкой, эти разрывы новой строки будут потеряны.

0
27.01.2020, 21:12

Теги

Похожие вопросы