Я должен получить свои учетные данные db из этого файла конфигурации:
# 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" )
который возвращает
mydb #Aisse.Trace_blabla4.tra
это было бы нормально, если бы он не возвращал также строку комментария.
Тогда я также пробовал
mydbname=$(echo "$my_conf_file.conf" | grep "Aisse.LocalDataBase = " | sed "s/LocalDataBase=//g" )
который возвращает недействительную строку.
Как я могу получить только значение, которому предшествует строка "Aisse.LocalDataBase = "
?
Ты можешь использовать
mydbname=$(sed -n 's/^Aisse\.LocalDataBase=\(.*\)/\1/p' file)
Если могут быть начальные пробелы, вы можете добавить [[:blank:]]*
после ^
:
mydbname=$(sed -n 's/^[[:blank:]]*Aisse\.LocalDataBase=\(.*\)/\1/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=\(.*\)/\1/p' <<< "$s"
Выход:
mydb
Подробности:
-n
- подавляет вывод строки по умолчанию в sed
^[[:blank:]]*Aisse\.LocalDataBase=\(.*\)
- регулярное выражение, которое соответствует началу строки (^
), затем ноль или более пробелов ([[:blank:]]*
), затем строка Aisse.LocalDataBase=
, затем захватывает оставшуюся часть строки в группу 1\1
- заменяет все совпадение значением группы 1p
- 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
) строки, содержащие:
^
: начало линии *
: возможный список пробелов#
: символ решеткиКогда у вас есть линия, с ней нужно работать:
Вам нужна только часть за знаком равенства, поэтому давайте используем этот знак в качестве разделителя и покажем второй столбец:
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
Радоваться, веселиться.
Спасибо за этот очень полный ответ!