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

Я нашел решение.

Добавьте параметр --delete-first, так что это:

mirror -c -P5 --log='/var/log/'"$base_name"'.log' "$remote_dir" "$local_dir"

становится следующим:

mirror -c -P5 --delete-first --log='/home/osmc/'"$base_name"'.log' "$remote_dir" "$local_dir"
1
17.04.2017, 06:07
2 ответа

Итерация записей, сохранение идентификатора для $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
  ]
1
27.01.2020, 23:34

Используем оператор range , из sed для выбора интересующего нас диапазона строк. Для данного сценария диапазон начинается со строки $package и заканчивается ] (в разных строках).

Сначала мы отбрасываем любые строки вне диапазона, /\$package/,/]/!d, а затем из диапазона печатаем их все (из-за неявной печати свойства pattern space в sed) НО выходим, как только встречается строка со строкой ]. Это означает, что мы вывели в stdout первый из диапазонов /\$package/,/]/

sed -e '/\$packages/,/]/!d; /]/q' yourfile
sed -n '/\$packages/,/]/p; /]/q' yourfile
1
27.01.2020, 23:34

Теги

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