Извлечь точный шаблон из строки через bashscript (sed / awk / grep?)

#regex #unix #awk #sed #grep

#регулярное выражение #unix #awk #sed #grep

Вопрос:

Приветствую сообщество Stack Overflow.

В настоящее время я борюсь с относительно простой вещью. Чтобы автоматически находить и регистрировать конфигурации приложений, я в настоящее время работаю над скриптом, который считывает данные конфигурации из файла конфигурации определенных приложений. Поскольку эти конфигурационные файлы могут различаться по синтаксису, и единственной константой является шаблон, например, имен БД, я хочу извлечь эти имена БД с помощью регулярного выражения.

Например:

Имена БД всегда имеют синтаксис db_s{serverid}_{dbid}

где идентификатор сервера состоит из 2-4 чисел, а идентификатор базы данных из 2-4 чисел, считая вверх. допустимыми именами БД были бы, например:

 db_s0001_01
db_s1337_42
db_s123_123
db_s42_1337
  

Имена баз данных хранятся в файлах конфигурации с различным синтаксисом, в зависимости от используемого приложения.
Вот несколько примеров:

 define( 'DB_NAME', 'db_s0001_01' );
define( 'DB_NAME', "db_s0001_01" );
'dbname' => 'db_s0001_01',
'dbname' => "db_s0001_01",
database_name: db_s0001_01
  

Разбиение конфигурационных файлов для получения правильных строк для правильных учетных переменных не является проблемой. Но как бы мне продолжить и извлечь точное имя базы данных из конфигурационных строк?

Регулярное выражение должно быть чем-то вроде

 (db_s[0-9]{2,4}_[0-9]{2,4})
  

Но я не совсем понимаю, какой инструмент использовать и как извлечь точное имя базы данных.
Итак, как бы извлечь из этого только имя базы данных?

 echo 'define( 'DB_NAME', "db_s0001_01" );' | grep/sed/awk (db_s[0-9]{2,4}_[0-9]{2,4})
  

Комментарии:

1. Одинарные кавычки не вставляются. Попробуйте echo без какого-либо канала, он не печатает то, что вы ожидаете.

Ответ №1:

Как упоминалось в комментариях, символы одинарных кавычек не вставляются. Итак, входные данные, с которыми вы тестируете, неверны. После исправления этого я бы использовал sed для извлечения имен БД следующим образом:

 echo "define( 'DB_NAME', "db_s0001_01" );" | sed 's/.*(db_s[0-9]{2,4}_[0-9]{2,4}).*/1/g'