【问题标题】:Extact exact pattern from string through bashscript (sed/awk/grep?)通过 bash 脚本 (sed/awk/grep?) 从字符串中提取准确的模式
【发布时间】:2020-12-04 03:22:03
【问题描述】:

问候 Stack Overflow 社区。​​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}_[0-9]{2,4})

【问题讨论】:

  • 单引号不嵌套。尝试不带任何管道的echo,它不会打印您期望的内容。

标签: regex unix awk sed grep


【解决方案1】:

如 cmets 中所述,单引号字符不嵌套。因此,您正在测试的输入不正确。修复后,我会使用sed 来提取数据库名称,如下所示:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-11-29
    • 2013-03-01
    • 1970-01-01
    • 2012-09-17
    • 2013-08-17
    • 1970-01-01
    • 2022-01-13
    相关资源
    最近更新 更多