Как напечатать только 1 имя файла вместе с совпадающим шаблоном?

Попробуйте следующий SED:

sed '/with_ajax_wait/{/end/!N;N;s/^/  it \"waits\" do\n/;s/$/\nend/;s/\n/\n  /g}'

Это работает для приведенного вами примера.

Версия Mac OS

(Проверено на OS X 10.8.5) Mac OS не любит определенные строки или цепочки команд вместе с точкой с запятой. Вместо этого используйте следующее:

sed -E -e '/with_ajax_wait/{' -e '/end/!N' -e 'N' -e 's/^/  it \"waits\" do\
/' -e 's/$/\
end/' -e 's/\n/\
  /g' -e '}'

Это буквально новые строки, которые можно вводить в терминале или копировать.

Как это работает

Ключом является команда N. Мы хотим заполнить память SED (пространство шаблона N) группой формы

  with_ajax_wait
    // commands
  end

Программа обходит файл строкой за раз, пока не достигнет соответствия строки с_ajax_wait; затем выполняет команду N, которая добавляет к пространству шаблона больше строк, пока не достигнет соответствия строки концу . Остальная часть программы представляет собой последовательность замен, которая выполняет обёртку: мы добавляем строку , которая "ждёт" линии do к началу блока, строку do к концу, а затем мы делаем отступ от всего.

Ограничения

  • Это не сработает, если слово end встречается в любом месте внутри блока с_ajax_wait ... end. Чтобы это сработало, потребуется более серьезный разбор самого кода. Если мы можем гарантировать, что закрывающий end всегда будет смещен на два пробела, то мы можем сделать этот SED немного лучше, заменив {/end/!N на {/\n end/!N или что-нибудь в этом роде.
  • Команды it "waitits" do и do всегда отступают на два пробела, даже если текст внутри отступает более или менее. Вероятно, это легче исправить за счет более сложной команды.
1
14.02.2018, 09:30
1 ответ

Is there a better way to speedup the process?

Sí, se llama GNUparallel:

parallel -j0 -k "grep -Hof list_of_patterns.txt {} | sort -u" ::: /path/to/files/*
  • j N-número de puestos de trabajo. Ejecute hasta Ntrabajos en paralelo. 0significa tantos como sea posible.
  • k(--keep-order)-mantener la secuencia de salida igual que el orden de entrada
  • ::: arguments-use argumentsdesde la línea de comando como fuente de entrada en lugar de stdin (entrada estándar)
3
27.01.2020, 23:23

Теги

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