Я написал инструмент Perl именно для этой проблемы ключа, значения:
Объединение правильных строк в пары: любое количество файлы . Он также доступен на GitHub .
Чтобы выполнить его, введите:
merge -k -e "-" jointest1.txt jointest2.txt
Если вы хотите, чтобы строки обрабатывались отдельно (в вашем первом примере ), но чтобы несколько совпадений в строке выводились в одну строку (, как во втором примере ), я не думаю, что это возможно только с 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
С помощью GNU grep
вы можете сделать следующее:
grep -o 'This.*day' theabovetext
(обратите внимание, что вам не нужно cat
, так как grep
умеет читать файлы)
Флаг -o
показывает только те части строки, которые соответствуют шаблону.
Я подозреваю, что другие версии grep
также поддерживают этот флаг, но его нет в POSIX, поэтому он не обязательно переносимый.
Ответ Эрика Ренуфа делает большую часть работы. А комментарий steeldriver вырезает лишний текст в заданной строке, делая ее не-жадной.
Таким образом, похоже, что:grep -oP 'This.*?day' theabovetext
делает все, что вы хотите, за исключением того, что вывод находится в нескольких строках.
Чтобы поместить вывод в одну строку, вы можете сделать grep -oP 'This.*?day' theabovetext | tr '\n' ' '
. Это дополнение просто заменяет разрывы строк пробелами *
*Это заменит все выходные символы новой строки пробелами. Поэтому, если ваш первоначальный ввод разделен строкой, эти разрывы новой строки будут потеряны.