Печать от первого экземпляра текста A до первого экземпляра текста B

Печать от первого экземпляра текста A до первого экземпляра текста B

У меня внутри программы есть следующий массив:

  ... #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

Связанный контент