sed или awk для печати строк между словами - PullRequest
3 голосов
/ 23 августа 2010

как напечатать все строки между "разделом B" (слово "До следующего" раздела ", начинающееся со строки?

раздел A (

.

)

секция B (

..

)

секция C (

.

)

Ответы [ 4 ]

6 голосов
/ 23 августа 2010
sed -n '
  /^section B/!n;
  /^section B/d;
  /^)/q;
  p
' yourfile

Объяснение вышеприведенного сценария sed в шагах:

  1. Пока строка не ! начинается с section B, переходите к следующей строке.
  2. После того, как мы достигли желаемой строки, удалите текстовую строку section B.
  3. В случае, если строка начинается с ), мы выходим.
  4. В противном случае мы печатаем текущую обработанную строку.
4 голосов
/ 24 августа 2010

Если вы хотите распечатать все из «раздела B» в «раздел C» , включая эти строки,

sed -ne '/^section B/,/^section/p'

Если вы не хотите печатать два «раздела"lines,

sed -e '1,/^section B/d' -e '/^section/,$d'

Если вы хотите включить" раздел B "и закрывающую скобку (но не" раздел C "),

sed -ne '/^section B/,/^)/p'

И есть несколько других возможныхварианты.

2 голосов
/ 24 августа 2010
sed -n '/section B/,/)/p' file

или awk

awk '/section B/,/)/{print}' file

awk -vRS=")" '/section B/{print $0RT}' file
0 голосов
/ 23 августа 2010

В общем, если вы хотите «поддерживать состояние» между строками в файле - как вы делаете здесь - тогда sed не сделает эту работу. Awk, вероятно, следующий простейший инструмент, который вы можете использовать в этом случае.

Следующий скрипт awk сделает то, что вы хотите:

/^section\ B\ \(/   {InSection=1; next;}
/^\)/       {InSection=0; next;}
//          {if (InSection) print $0;}
...