Регулярное выражение Bash: получить значение в файле conf, которому предшествует строка с точкой

Я должен получить свои учетные данные 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 = "?

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
53
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Ты можешь использовать

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 - заменяет все совпадение значением группы 1
  • 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) строки, содержащие:

  • ^ : начало линии
  • * : возможный список пробелов
  • # : символ решетки

Когда у вас есть линия, с ней нужно работать:
Вам нужна только часть за знаком равенства, поэтому давайте используем этот знак в качестве разделителя и покажем второй столбец:

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

Радоваться, веселиться.

Спасибо за этот очень полный ответ!

Tms91 06.04.2022 18:24

Другие вопросы по теме