Я пишу сценарий bash для проекта миграции кода, который состоит из трех этапов: синтаксический анализ, обработка и исправление. Он использует sed с регулярным выражением для анализа файла, который содержит директивы, как показано:
$(first_directive) : [ \
$(dependency) ] \
$(another_dependency) \
# several commands here
$(second_directive) : \
$(more_dependencies)
# more commands here
Здесь полезными данными для процесса являются только строки $ (first_directive) и $ (second_directive), и я могу их распознать. потому что это уникальные строки с двоеточием после них. Чтобы проанализировать эти строки, я использую в сценарии такую команду:
# Commands before
patterns=$(sed -nr "/\\$\(\w*\)\s*:/p" "${file}")
# More commands and processing after
Это отлично работает, но я обнаружил, что несколько строк прокомментированы с #, и я должен отбросить их при синтаксическом анализе. этап, чтобы избежать ошибок на следующих этапах процесса. Вот пример:
$(third_directive) : [ \
$(dependency) ] \
# several commands here
#$(old_directive) : \ # I don't need this directive
# $(old_dependencies)
### Commented code here
# $(another_old_directive) : \ # I don't need this either
Итак, я ищу параметры sed или другое регулярное выражение, которое позволяет мне исключить закомментированные строки, но мне пока не удалось. Можно сделать это только с помощью команды?
Вот некоторые регулярные выражения, которые я тестировал:
(?:[^\#]\s*)\$\(\w*\)\s*
.*[^#]\$\([A-Za-z]*\)\s*:
Изменить: # может не быть в начале линия. В некоторых случаях раньше есть пробелы.