Home > Software design >  Bash regex: get value in conf file preceded by string with dot
Bash regex: get value in conf file preceded by string with dot

Time:04-06

I have to get my db credentials from this configuration file:

# 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

In particular, I want to get the value mydb from line

Aisse.LocalDataBase=mydb

So far, I have developed this

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

that returns

mydb #Aisse.Trace_blabla4.tra

And

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

that retruns void string.

How can I get only the value that is preceded by the string "Aisse.LocalDataBase=" ?

CodePudding user response:

Using sed

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

CodePudding user response:

You can use

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

If there can be leading whitespace you can add [[:blank:]]* after ^:

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

See 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=\(.*\)/\1/p' <<< "$s"

Output:

mydb

Details:

  • -n - suppresses default line output in sed
  • ^[[:blank:]]*Aisse\.LocalDataBase=\(.*\) - a regex that matches the start of a string (^), then zero or more whiespaces ([[:blank:]]*), then a Aisse.LocalDataBase= string, then captures the rest of the line into Group 1
  • \1 - replaces the whole match with the value of Group 1
  • p - prints the result of the successful substitution.

CodePudding user response:

You may use this sed:

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

mydb

RegEx Details:

  • ^: Start
  • [^#]: Matches any character other than #
  • [^=]*: Matches 0 or more of any character that is not =
  • LocalDataBase=: Matches text LocalDataBase=

CodePudding user response:

I'm afraid you're being incomplete:
You mention you want the line, containing "LocalDataBase", but you don't want the line in comment, let's start with that:

A line which contains "LocalDataBase":

grep "LocalDataBase" conf.conf.txt

A line which contains "LocalDataBase" but who does not start with a hash:

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

??? grep -v "^ *#"

That means: don't show (-v) the lines, containing:

  • ^ : the start of the line
  • * : a possible list of space characters
  • # : a hash character

Once you have your line, you need to work with it:
You only need the part behind the equality sign, so let's use that sign as a delimiter and show the second column:

cut -d '=' -f 2

All together:

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

Are we there yet?
No, because it's possible that somebody has put some comment behind your entry, something like:

LocalDataBase=mydb #some information

In order to prevent that, you need to cut that comment too, which you can do in a similar way as before: this time you use the hash character as a delimiter and you show the first column:

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

Have fun.

  • Related