Почему это регулярное выражение не работает?

Я хочу посмотреть на вывод git status -s чтобы определить, есть ли в дереве какие-либо необработанные файлы. Я пробовал следующий тест, но регулярное выражение не совпадает. Почему нет?

 $ git status -s ## master M updated-file ?? new-file $ [[ $(git status -s) =~ ^\?\? ]] || echo "no match" no match 

Я также хотел бы иметь возможность протестировать добавленные / измененные / удаленные файлы таким же образом. Обычно для этого я использую что-то вроде ^\s*[AMD] , но это тоже не работает. Что дает?

  • Выбирает поддержку OR в своих регулярных выражениях?
  • Как заменить этот шаблон на новую строку внутри?
  • Какой тип движка регулярного выражения использует bash?
  • Найти только в каталогах n уровней
  • Какое регулярное выражение в grep ищет строки из трех одинаковых букв подряд?
  • Есть ли эквивалент для vim \ zs в sed или perl?
  • вставить новую строку, когда отрицательный + положительный шаблон найден с помощью sed
  • где скрывается тема AlaDelta и как ее удалить / очистить / удалить
  • One Solution collect form web for “Почему это регулярное выражение не работает?”

    Вы сопоставляетесь со всей строкой, а не с каждой строкой строки, поэтому вы действительно проверяете против ## в этом регулярном выражении.

    grep – лучший выбор для этого:

     if ! git status -s | grep -q '^??'; then echo "no match" fi 

    По запросу вы можете сделать то же самое для добавления / изменения / удаления:

     git status -s | grep '^ *[AMD]' 

    Вы также можете посмотреть в git status --porcelain (вариант, который впервые появился в версии 1.7.0), который больше ориентирован на разбор.

    Linux и Unix - лучшая ОС в мире.