захватить из текстового файла диапазон с использованием двух переменных в качестве начального и конечного параметров

Я пытаюсь захватить определенный диапазон строк из текстового файла, используя grep; диапазон строк должен быть идентифицирован двумя переменными. до сих пор я пытался это сделать с помощью подстановочных символов * * Примеры неудачных попыток включают: (я вижу, почему первые два не должны работать, но отчаялись и надеялись на чудо)

grep "$Var1"*"$Var2" file.txt grep "$Var1*$Var2" file.txt echo "$Var1*$Var2" | grep file.txt 

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

grep не предназначен для поиска шаблонов по нескольким линиям. Есть и другие инструменты, которые лучше подходят для этой задачи: awk и sed .

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


Использование awk :

 awk '/'"$Var1"'/,/'"$Var2"'/' file.txt 

Та же команда с жестко закодированными шаблонами для объяснения концепции:

 awk '/pattern1/,/pattern2/' file.txt 

Объяснение:

  • /pattern1/,/pattern2/ – это диапазон. диапазон начинается с pattern2 соответствия pattern2 и заканчивается на pattern2 сопоставления pattern2 .
  • по умолчанию awk только печатает строки, находящиеся в диапазоне.

Подробнее об awk : http://www.catonmat.net/blog/awk-one-liners-explained-part-one/


Использование sed :

 sed -n '/'"$Var1"'/,/'"$Var2"'/ p' file.txt 

Та же команда с жестко закодированными шаблонами для объяснения концепции:

 sed -n '/pattern1/,/pattern2/ p' file.txt 

Объяснение:

  • -n делает sed для печати строк, только если сказано.
  • /pattern1/,/pattern2/ – это диапазон. диапазон начинается с pattern2 соответствия pattern2 и заканчивается на pattern2 сопоставления pattern2 . для каждой строки в этом диапазоне выполняются следующие команды.
  • p в конце говорит sed печатать строки.

Узнайте больше о sed : http://www.catonmat.net/blog/sed-one-liners-explained-part-one/


Если вам действительно нужно использовать grep вы можете использовать -P чтобы сообщить grep использовать механизм регулярных выражений perl. На странице руководства это говорит об этой функции:

Интерпретируйте шаблон как совместимое с Perl регулярное выражение (PCRE). Это очень экспериментально, и grep -P может предупредить о нереализованных функциях.