2014-12-17 2 views
2

Пожалуйста, помогите - я очень ржав с моим sed/awk/grep, и я пытаюсь обработать файл (экспорт PDF, который составляет около 4700 страниц).Сценарий Bash для печати рисунка 1, поиск и печать всех строк с рисунка 2 по шаблону 3 и рисунка печати 4

Вот что я пытаюсь сделать: поиск/печать строки соответствия шаблону 1, поиск шаблона соответствия строк 2 и печать этой строки и всех строк от нее до шаблона 3 (если он включает/печатает строку с рисунком 3, я в порядке с этим в данный момент) и поиск/печать строк, соответствующих рисунку 4.

Все вышеуказанные шаблоны должны происходить по порядку (рисунок 1,2,3,4) несколько сотен раз в файл, и мне нужно держать их в порядке.

Схема 1: строки, начинающиеся с 1-5 и пробельных (это достаточно конкретным, несмотря на это, казалось расплывчатым) шаблон 2: строки, начинающиеся с (заглавными буквами) РЕШЕНИЕ: шаблон 3: Строки, начинающиеся с (все заглавные буквы) СООТВЕТСТВИЕ: Pattern 4: строки, начинающиеся с IP-адресами

Вот что я починил, но это явно не работает:

#!/bin/bash 
# 
sed ' 

/^[1-5]\s/p { 

     /^SOLUTION/,/^COMPLIANCE/p { 

       /^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}/p } 

}' sample.txt 
+2

Добавьте несколько строк из 'sample.txt' к вашему вопросу. – nwk

+0

grep предназначен для поиска RE в файле и печати соответствующей строки. sed предназначен для создания простых подстановок на отдельных строках в файле. Для чего-то еще вы просто должны использовать awk. Отправьте пример ввода и ожидаемый результат, и мы можем вам помочь. Что, если, например, вы нажмете две строки, начинающиеся с цифр 1-5 и пробел перед первой строкой, начинающейся с РЕШЕНИЯ? Вы игнорируете первый или что? Поиск строк, которые совпадают, всегда тривиально, он обрабатывает похожие строки, которые не совпадают, что сложно, поэтому создайте свой образец ввода, чтобы показать THAT. –

ответ

1

использовать p в СЭД вам нужно использовать -n, а также и также добавьте -r для расширенного регулярного выражения:

Вот как это должно выглядеть следующим образом:

sed -r -n '{ 
/^[1-5] /p 
/^SOLUTION/,/^COMPLIANCE/p 
/^([0-9]{1,3}[\.]){3}[0-9]{1,3}/p 
}' sample.txt 
+0

Я буквально просто получил его на работу, но мне действительно нравится ваш метод IP-адреса лучше. Очень ценим! –

+0

добро пожаловать – tinySandy

+0

Не будет ли печатать строки, соответствующие каждому условию, независимо от того, в каком порядке выполняются условия? –

1

Вы, вероятно, хотите что-то вроде этого, непроверенное, так как вы не предоставили какой-либо ввод образца или ожидаемый результат:

awk ' 
BEGIN   { state = 0 } 
/^[1-5]/ { if (state ~ /[01]/) { block = $0; state = 1 } } 
/^SOLUTION/ { state = (state ~ /[12]/ ? 2 : 0) } 
state == 2 { block = block ORS $0 } 
/^COMPLIANCE/ { state = (state == 2 ? 3 : state) } 
/^([0-9]{1,3}\.){3}[0-9]{1,3}/ { if (state == 3) { print block ORS $0; state = 0 } } 
' file 
Смежные вопросы