Я ищу способ создания bash-скрипта с использованием, возможно, sed или awk, для поиска определенной строки текста, например «устарел из: 4. *». Если сценарий найден, он должен взять текст, найденный между двумя шаблонами, сделать резервную копию текста в файл, а затем удалить текст из исходного входного файла. Итак, я ищу способ отфильтровать некоторые устаревшие части очень большого файла MIB, который имеет следующую структуру:
-- /*********************************************************************************/
-- /* MIB table for foo 'Something that was once very cool */
-- /* Valid from: 4.1.01 */
-- /* Valid to: 4.2 */
-- /* Deprecated from: 4.2 */
-- /*********************************************************************************/
foo bar foo bar foo bar foo bar foo bar foo bar foo bar
foo bar foo bar foo bar foo bar foo bar foo bar foo bar
foo bar foo bar foo bar foo bar foo bar foo bar foo bar
foo bar foo bar foo bar foo bar foo bar foo bar foo bar
foo bar foo bar foo bar foo bar foo bar foo bar foo bar
foo bar foo bar foo bar foo bar foo bar foo bar foo bar
foo bar foo bar foo bar foo bar foo bar foo bar foo bar
foo bar foo bar foo bar foo bar foo bar foo bar foo bar
-- /*********************************************************************************/
-- /* MIB table for bar 'Another thing that was once very cool */
-- /* Valid from: 4.2.01 */
-- /* Valid to: 4.3 */
-- /* Deprecated from: 4.3 */
-- /*********************************************************************************/
foo bar foo bar foo bar foo bar foo bar foo bar foo bar
foo bar foo bar foo bar foo bar foo bar foo bar foo bar
foo bar foo bar foo bar foo bar foo bar foo bar foo bar
foo bar foo bar foo bar foo bar foo bar foo bar foo bar
foo bar foo bar foo bar foo bar foo bar foo bar foo bar
foo bar foo bar foo bar foo bar foo bar foo bar foo bar
foo bar foo bar foo bar foo bar foo bar foo bar foo bar
foo bar foo bar foo bar foo bar foo bar foo bar foo bar
Итак, в данном случае, скажем, я хочу избавиться от раздела, содержащего «Устаревшее от 4.2». Я придумал следующий сценарий awk, который приближает меня:
{ a[i++ % 5 ]=$0}
/Deprecated from: 4.2/ {print a[(i-5)%5];print a[(i-4)%5];print a[(i-3)%5];print a[(i-2)%5];i=0}
/Deprecated from: 4.2/,/test/ {if($0 !~ /test/) print }
Однако это работает, только если MIB использует слово «тест» в качестве последней части диапазона для поиска. В действительности конец диапазона поиска выглядит следующим образом:
-- /*********************************************************************************/
Что мне нужно сделать, это пропустить первый экземпляр этого, который происходит сразу после строки, содержащей «Отклонено от», и продолжить поиск до следующего вхождения.
Ожидаемый результат после использования приведенного выше примера MIB и удаления всех вхождений из 4.2 будет следующим:
-- /*********************************************************************************/
-- /* MIB table for bar 'Another thing that was once very cool */
-- /* Valid from: 4.2.01 */
-- /* Valid to: 4.3 */
-- /* Deprecated from: 4.3 */
-- /*********************************************************************************/
foo bar foo bar foo bar foo bar foo bar foo bar foo bar
foo bar foo bar foo bar foo bar foo bar foo bar foo bar
foo bar foo bar foo bar foo bar foo bar foo bar foo bar
foo bar foo bar foo bar foo bar foo bar foo bar foo bar
foo bar foo bar foo bar foo bar foo bar foo bar foo bar
foo bar foo bar foo bar foo bar foo bar foo bar foo bar
foo bar foo bar foo bar foo bar foo bar foo bar foo bar
foo bar foo bar foo bar foo bar foo bar foo bar foo bar
См. Пример кода выше, работающего здесь: http://ideone.com/bOQuK
Моя проблема в том, что мне нужно найти закрывающий паттерн
-- /*********************************************************************************/
Не
-- /test/
Есть идеи?