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)
#!/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
玩得开心。
我必须从这个配置文件中获取我的数据库凭据:
# 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)
#!/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
玩得开心。