Как извлечь текст из файла в сценарии bash

Я пытаюсь извлечь текст из многострочного файла. Например, мне нужно извлечь весь текст из «Раздел 1.0» в «Раздел 3.0».

Это может быть на многих линиях.

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

flag="false"

for line in ${textFile}; 
do
   if [ "$line" == "Section 3.0" ]; then
      flag="false"
   fi
   if [ "$flag" == "true" ]; then
      temp_var+=$line
   fi
   if [ "$line" == "Section 1.0" ]; then
      flag="true"
   fi
done

person Todd Iglehart    schedule 19.03.2014    source источник


Ответы (3)


Используя sed, вы можете сделать:

sed -n '/Section 1\.0/,/Section 3\.0/p' file

EDIT: Чтобы игнорировать начальный и конечный шаблоны, используйте:

sed -n '/Section 1\.0/,/Section 3\.0/{/Section [13]\.0/!p;}' file

нестандартное решение:

awk '/Section 1\.0/{flag=0} flag{print} /Section 3\.0/{flag=1}' file
person anubhava    schedule 19.03.2014
comment
Да, раздел 1 предшествует разделу 3. Код такой, какой он есть, поэтому фактическое название раздела не пишется. - person Todd Iglehart; 19.03.2014

sed -n '/Section 1\.0/,/Section 3\.0/p' file

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

Если вам нужен только первый такой раздел, вы можете выйти, когда найдете конечное условие:

sed -n '/Section 3\.0/q;/Section 1\.0/,$p' file

Это исключит строку, соответствующую конечному условию (догадываясь, что вы на самом деле хотите). Для простоты предполагается, что у вас нет Раздела 3.0 до Раздела 1.0. (Для некоторых диалектов sed может потребоваться несколько иной синтаксис; возможно, придется заменить точку с запятой на новую строку или сценарий разбить на два отдельных аргумента -e.)

person tripleee    schedule 19.03.2014

awk также можно использовать:

awk '/Section 3\.0/{f=0} f; /Section 1\.0/{f=1}' file
person Jotne    schedule 19.03.2014