sed - извлечь значение подстановкой из первой строки, соответствующей 2-му regexp, следующей за строкой, найденной с помощью 1-го regexp

Имея файл 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")

0
23.01.2017, 04:18
1 ответ

У вас должна быть возможность добавить второй фильтр как подвыражение между фигурными скобками

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 должен быть заключен в фигурные скобки и разделен символами новой строки и соответствовать следующим правилам. Перед фигурными скобками могут стоять пробелы. Перед функциями могут стоять пробелы, но после них нельзя ставить пробелы. Перед правой фигурной скобкой должна стоять новая строка, а перед ней или могут стоять пробелы.

1
28.01.2020, 02:46

Теги

Похожие вопросы