Как я могу исключить указанные c строк с помощью sed? - PullRequest
1 голос
/ 28 мая 2020

У меня есть эта команда для запуска git log и refre sh списка файлов:

sed -E 's|(.*): .*|echo \1: $(git log -1 --pretty="format:%ct" \1)|e' app/config/file.yml

Моя проблема в том, что эта команда refre sh каждую строку в file.yml, но у меня есть префикс, который я не хочу обновлять sh. Префикс - web / compile / *

Я пытался сделать с этим, но, к сожалению, удалил префикс eveything whitout / web / compile.

sed -i.bkp '/web\/compiled\/*/!e' -E 's|(.*): .*|echo \1: $(git log -1 --pretty="format:%ct" \1)|e' app/config/file.yml

1 Ответ

3 голосов
/ 28 мая 2020
  • Прежде всего, вы должны знать, что использование sed для изменения файла yaml рискованно . (Я видел, что вы сохраняете ведущий материал до последнего :, чтобы не мешать отступам, но это небезопасно)

  • используя sed, вы можете сопоставить образец /pattern/{action}, здесь вы просто заполняете часть pattern своим «префиксным» путем. Однако дважды проверьте свой «префикс», если есть начальные пробелы (отступ), вы можете захотеть иметь \s*/web/com....

  • , аналогичный вашему s|pat|rep_or_cmd|e, вы можете использовать другой разделитель для сопоставления с образцом, о котором мы говорили в предыдущем пункте, если ваш образец содержит sla sh. поэтому \@^\s*/web/compile@ будет легче читать

  • прийти к решению. У вас есть два разных способа сделать то, что вы хотите:

    sed '\@^\s*/web/compile@n; s|your s cmd....|' file
    

ИЛИ

    sed '\@^\s*/web/compile@!s|your s cmd....|' file

Примечание

В вашем вопросе префикс, который вы писал иногда web/compile иногда /web/compile, вы должны написать правильный в команде sed и test.

...