Следующая команда отвечает на ваш вопрос: она собирает все значения, содержащиеся в шаблоне Code>...<Code
, если за ними следует шаблон Type>...<Type
(с потенциально другими шаблонами между ними, но между ними нет других вхождений Code>...<Code
между):
perl -lne 's/^.*?(?=Code>)//s; for (split /Code>/) { print qq($1:$2\n) if /(.*?)<Code.*?Type>(.*?)<Type/s }' -0777 <test.txt
Если, например, test.txt
содержит следующие строки,
Code>test4<Code Type>false<Type
Code>test3<Code
Type>true<Type
Code>TEST1<Code Code2>best<Code2
Code>test2<Code
Type>false<Type
, то команда соберет следующие пары значений:
test4:false
test3:true
test2:false
Отредактировано 08/04/2019, 17:38 CEST Я отредактировал команду для удаления «части заголовка» файла (части до первого появления Code>
),так как он может - по какой-то ошибке редактора файла - содержать закрывающий тег <Code
, который был открыт не с Code>
, а вместо этого с опечаткой, например, Cde>
.Мое предположение состояло в том, что полный файл был «синтаксически правильным» в том смысле, что он состоит из элементов типа /(\w+)>.*?<\1/
, разделенных пробелами (включая символы новой строки).Для файлов, которые не соответствуют этому синтаксису, заявление не было водонепроницаемым.