У меня внутри программы есть следующий массив:
... #code
$packages = [
'git', # version control
...
'iftop', # monitor network usage by ip
'iotop', # monitor io usage
]
... #more code
Я хочу использовать awk
для печати строк от первого вхождения $packages до первого окончания ]
, после вхождения $packages
.
Как я могу это сделать?
решение1
Выполнить итерацию по записям, сохранить идентификатор для $packages
, вывести строки, когда идентификатор установлен, и выйти после печати, когда вы найдете следующее ]
:
awk '/\$packages/ {c=1; print; next} /\]/ {print; exit}; c{print}'
Пример:
% cat file.txt
... #code
$packages = [
'git', # version control
...
'iftop', # monitor network usage by ip
'iotop', # monitor io usage
]
... #more code
... #code
$packages = [
'git', # version control
...
'iftop', # monitor network usage by ip
'iotop', # monitor io usage
]
... #more code
% awk '/\$packages/ {c=1; print; next} /\]/ {print; exit}; c{print}' file.txt
$packages = [
'git', # version control
...
'iftop', # monitor network usage by ip
'iotop', # monitor io usage
]
решение2
Мы используем range
оператор ,
для sed
выбора интересующего нас диапазона строк. В этом сценарии диапазон начинается со строки $package
и заканчивается ]
(на разных строках).
Сначала мы отбрасываем все строки за пределами диапазона, /\$package/,/]/!d
а затем из диапазона мы печатаем их все (из-за неявной печати свойства пространства шаблонов sed
), НО quit
как только ]
встречается строка со строкой. это подразумевает, что мы вывели на stdout первый из диапазонов/\$package/,/]/
sed -e '/\$packages/,/]/!d; /]/q' yourfile
sed -n '/\$packages/,/]/p; /]/q' yourfile