LINUX.ORG.RU

вырезать кусок из файла

 , ,


0

1

Дано: файл с кучей конфы, в конфе есть блоки начинающиеся для отличия с ##START $USER и заканчивающиеся ##END $USER $USER это переменная. таких блоков сотни, как можно вырезать эти блоки с определенной переменной?

★★★

В лоб, не факт, что красиво.

Это если встречается всего один раз

#!/bin/sh
FILE="Путь к файлу"
START=`grep -n "##START $USER" "$FILE" | cut -f1 -d:`
END=`grep -n "##END $USER" "$FILE" | cut -f1 -d:`
sed -n $START,$ENDp  $FILE

Если несколько то нужно добавить цикл.

Собственно тем же sed срезать в цикле по две строки и получать верхнюю и нижнюю границу каждого блока.

kostik87 ★★★★★
()
Последнее исправление: kostik87 (всего исправлений: 2)
awk -vu=$USER '
              flag == 1                  {print "тело блока"}; 
              $1 == "##START" && $2 == u {print "нашли начало"; flag=1}; 
              $1 == "##END"   && $2 == u {print "нашли конец";  flag=0}'

Смысл понятен?

sdio ★★★★★
()
Последнее исправление: sdio (всего исправлений: 2)

sed -n '/от/,/до/p'

YAR ★★★★★
()

Обычный csplit подойдет?

man csplit

anonymous
()

Ох, это же идельное место для использования http://perldoc.perl.org/perlop.html#Range-Operators в качестве flip-flop оператора. Как я понял стоит поискать его аналог в sed и awk

The operator is bistable, like a flip-flop, and emulates the line-range (comma) operator of sed, awk, and various editors

anonymous
()
Ответ на: комментарий от anonymous

Тут вырезаем блоки с именем cat.

perl -ne 'print unless (/START cat/ .. /END cat/)' in > out
[/cdode]

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.