У меня есть две части знакомой мне строки, называемые phrase1
и phrase2
, которые находятся в одной строке файла и встречаются несколько раз по всему файлу. Мне нужно извлечь эти строки из файла; однако между ними есть цифры, которых я не знаю, и строки могут отличаться. Например, есть строки, которые могут выглядеть следующим образом:
phrase1 654654 phrase2
phrase1 22 phrase2
phrase1 949 phrase2
etc.
Однако я знаю, что могу написать код специально для конкретной строки. Например, я могу написать для строки 2 выше следующее, чтобы найти его:
grep "phrase1 [0-9][0-9] phrase2" file
Какой код я могу написать, используя grep (или аналогичный), чтобы извлечь все строки, содержащие как phrase1
, так и phrase2
не зная чисел или что-нибудь еще в этом отношении, между?
Если строки, которые вы ищете , начинаются с phrase1
, а заканчиваются с phrase2
, то я бы предложил
grep "^phrase1.*phrase2$"
. список используемых специальных символов
^
соответствует началу строки $
соответствует концу строки .
соответствует каждому символ *
соответствует 0 или более экземплярам предыдущего символа Таким образом, в основном grep
ищет строки, начинающиеся с phrase1
, за которыми следуют 0 или более символов и заканчивая phrase2
.
Два метода: с регулярными выражениями:
grep "phrase1 .* phrase2" file
Этот поиск для фразы1, одного пробела, строки символов, которые могут быть любыми, другого пробела и фразы2, в любом месте строки ( это соответствует строкам, которые содержат больше материала до «фразы1» и после «фразы2»)
Если две фразы должны находиться в начале и конце строки, см. ответ @AndreasT: вы можете использовать ^
и $
«закрепить» регулярное выражение в начале и конце строки.
Если вы хотите сопоставить только цифры между двумя фразами, ответ minerz029 будет правильным; «[0-9] +» соответствует повторению цифры («+» означает «последовательность, по крайней мере, одного символа»).
Если вы хотите, чтобы числа и фраза1 и фраза2 были в начале и конце фразы, объедините двойки:
grep "^phrase1 [0-9]+ phrase2$" file
Или «трюк» /hack...
grep "phrase1" file | grep "phrase2"
Explication: первая команда ищет все вхождения фразы1, затем «передает» результирующие строки в качестве входных данных во второй grep, который выводит все строки, соответствующие фразе2.
Однако, как заметил @AndreasT, этот второй метод соответствует обращенному шаблону «фраза2 ... фраза1», что может быть нежелательным.
Используйте это для обнаружения только цифр между фразами:
grep -E '^phrase1 [0-9]+ phrase2 Опция -E
использует «Расширенные регулярные выражения», добавляя поддержку оператора +
.
Разбивка:
-
^
означает совпадение с началом строки. -
+
после [0-9]
означает поиск одного или нескольких вхождений предыдущего выражения, которое в данном случае является классом [0-9]
. -
$
означает совпадение с концом строки.
Опция -E
использует «Расширенные регулярные выражения», добавляя поддержку оператора +
.
Разбивка:
^
означает совпадение с началом строки. +
после [0-9]
означает поиск одного или нескольких вхождений предыдущего выражения, которое в данном случае является классом [0-9]
. $
означает совпадение с концом строки.