Bash 正则表达式:获取 conf 文件中的值,前面是带点的字符串

Bash regex: get value in conf file preceded by string with dot

我必须从这个配置文件中获取我的数据库凭据:

# Database settings

Aisse.LocalHost=localhost
Aisse.LocalDataBase=mydb
Aisse.LocalPort=5432
Aisse.LocalUser=myuser
Aisse.LocalPasswd=mypwd

# My other app settings

Aisse.NumDir=../../data/Num
Aisse.NumMobil=3000

# Log settings
#Aisse.Trace_AppliTpv=blabla1.tra
#Aisse.Trace_AppliCmp=blabla2.tra
#Aisse.Trace_AppliClt=blabla3.tra
#Aisse.Trace_LocalDataBase=blabla4.tra

特别是,我想从第

行获取值 mydb
Aisse.LocalDataBase=mydb

到目前为止,我已经开发了这个

mydbname=$(echo "$my_conf_file.conf" | grep "LocalDataBase=" | sed "s/LocalDataBase=//g" )

那个returns

mydb #Aisse.Trace_blabla4.tra

如果没有 return 注释字符串也可以。

那我也试过了

mydbname=$(echo "$my_conf_file.conf" | grep "Aisse.LocalDataBase=" | sed "s/LocalDataBase=//g" )

返回空字符串。

如何只获取字符串 "Aisse.LocalDataBase=" 前面的值?

您可以使用

mydbname=$(sed -n 's/^Aisse\.LocalDataBase=\(.*\)//p' file)

如果可以有前导空格,您可以在 ^:

之后添加 [[:blank:]]*
mydbname=$(sed -n 's/^[[:blank:]]*Aisse\.LocalDataBase=\(.*\)//p' file)

this online demo:

#!/bin/bash
s='# Database settings
 
Aisse.LocalHost=localhost
Aisse.LocalDataBase=mydb
Aisse.LocalPort=5432
Aisse.LocalUser=myuser
Aisse.LocalPasswd=mypwd
 
# My other app settings
 
Aisse.NumDir=../../data/Num
Aisse.NumMobil=3000
 
# Log settings
#Aisse.Trace_AppliTpv=blabla1.tra
#Aisse.Trace_AppliCmp=blabla2.tra
#Aisse.Trace_AppliClt=blabla3.tra
#Aisse.Trace_LocalDataBase=blabla4.tra'

sed -n 's/^Aisse\.LocalDataBase=\(.*\)//p' <<< "$s"

输出:

mydb

详情:

  • -n - 抑制 sed
  • 中的默认行输出
  • ^[[:blank:]]*Aisse\.LocalDataBase=\(.*\) - 匹配字符串开头的正则表达式 (^),然后是零个或多个空格 ([[:blank:]]*),然后是 Aisse.LocalDataBase= 字符串,然后将行的其余部分捕获到组 1
  • </code> - 用组 1</li> 的值替换整个匹配项 <li><code>p - p打印成功替换的结果。

使用sed

$ mydbname=$(sed -n 's/Aisse\.LocalDataBase=//p' input_file)
$ echo $mydbname
mydb

您可以使用这个 sed:

mydbname=$(sed -n 's/^[^#][^=]*LocalDataBase=//p' file)
echo "$mydbname"

mydb

正则表达式详细信息:

  • ^: 开始
  • [^#]:匹配除#
  • 以外的任何字符
  • [^=]*:匹配0个或多个非=
  • 的字符
  • LocalDataBase=:匹配文本 LocalDataBase=

恐怕你是不完整的:
你提到你想要包含“LocalDataBase”的行,但你不想要评论中的行,让我们从那开始:

包含“LocalDataBase”的一行:

grep "LocalDataBase" conf.conf.txt

包含“LocalDataBase”但不以散列开头的行:

grep "LocalDataBase" conf.conf.txt | grep -v "^ *#"

??? grep -v "^ *#"

这意味着:不显示 (-v) 行,包含:

  • ^ : 行首
  • * : space 个字符的可能列表
  • # : 哈希字符

有了线后,您需要使用它:
您只需要等号后面的部分,所以让我们使用该符号作为分隔符并显示第二列:

cut -d '=' -f 2

总计:

grep "LocalDataBase" conf.conf.txt | grep -v "^ *#" | cut -d '=' -f 2

我们到了吗?
不,因为可能有人在您的条目后面添加了一些评论,例如:

LocalDataBase=mydb #some information

为了防止出现这种情况,您还需要删除该注释,您可以按照与之前类似的方式执行此操作:这次您使用散列字符作为分隔符并显示第一列:

grep "LocalDataBase" conf.conf.txt | grep -v "^ *#" | cut -d '=' -f 2 | cut -d '#' -f 1

玩得开心。