Имея файл TestData.txt, содержащий строки, где junk может повторяться N или более раз, а положение строки "Model=Default" не фиксировано
...
junk
junk
Model="C"
junk
junk
Size="81"
junk
Model="Default" <---- Start of "Default" block
junk
...
junk
Size="47" <---- Required value of size (first "Size=" line after "Default")
junk
junk
Model="A"
junk
Size="22"
junk
junk
Model="T"
junk
junk
Size="32"
junk
...
и желая извлечь значение Size для случая Default, можно сделать следующее: распечатать строки между совпадениями, а затем применить вторую команду sed для выполнения подстановки, чтобы извлечь значение size.
sed -ne '/="Default"/,/Size=/p' TestData.txt | sed -ne 's|Size="\([1-9][0-9]*\)"|\1|p'
Это печатает 47, требуемое значение параметра "Size" из раздела "Default".
Можно ли объединить эти две операции sed в более эффективный один вызов sed?
(Это упрощенная форма реальной задачи, которая заключается в извлечении, с помощью более сложных регексов, одного значения из файла конфигурации, где есть несколько блоков, содержащих обозначение "size")
У вас должна быть возможность добавить второй фильтр как подвыражение между фигурными скобками
sed -ne '/="Default"/,/Size=/ {s/Size="\([1-9][0-9]*\)"/\1/p}' TestData.txt
или POSIXly
sed -ne '/="Default"/,/Size=/ {s/Size="\([1-9][0-9]*\)"/\1/p
}' TestData.txt
См. Команды редактирования в sed
{{ 1}}[2addr] {function function ... } {{1 }}
Выполнять список функций sed, только когда выбрано пространство шаблонов. Список функций sed должен быть заключен в фигурные скобки и разделен символами новой строки и соответствовать следующим правилам. Перед фигурными скобками могут стоять пробелы. Перед функциями могут стоять пробелы, но после них нельзя ставить пробелы. Перед правой фигурной скобкой должна стоять новая строка, а перед ней или могут стоять пробелы.