从字符串到bashscript提取确切的模式sed / awk / grep?

问题描述

问候堆栈溢出社区。​​ p>

我目前正在努力做一个相对简单的事情。 为了自动查找和记录应用程序配置,我目前正在处理一个脚本,该脚本从某些应用程序的配置文件中读取配置数据。 由于这些配置文件的语法可能不同,并且唯一的常量是例如数据库名称的模式,因此我想通过正则表达式提取这些数据库名称

例如:

数据库名称始终具有语法db_s {serverid} _ {dbid}

其中serverid由2-4个数字组成,而数据库id由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})

解决方法

如注释中所述,单引号字符不嵌套。因此,您要测试的输入不正确。解决此问题后,我将使用sed来提取数据库名称,如下所示:

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