Могу ли я исключить с помощью регулярного выражения и sed шаблон, который содержит # перед $ и возможные пробелы между ними? - PullRequest
0 голосов
/ 28 мая 2020

Я пишу сценарий 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*:

Изменить: # может не быть в начале линия. В некоторых случаях раньше есть пробелы.

Ответы [ 3 ]

2 голосов
/ 28 мая 2020

Не могли бы вы попробовать:

sed -n '/^[^#]*\$.*:/p' "$file"
2 голосов
/ 28 мая 2020

Вы можете просто исключить строки, начинающиеся с #:

^\s*[^#].*:.*\$\n

Здесь .* можно заменить любыми другими условиями, которые у вас могут быть.

0 голосов
/ 28 мая 2020

Это может сработать для вас (GNU sed):

sed -n '/^\s*\$([^)]*)\s*:/p' file

См. демо .

...