2015-10-05 2 views
3

У меня есть файл, как этот небольшой пример:Shell регулярного выражения до конца строки

# ... 
# mode=dev 
# ... 

Где-то в этом файле существует «переменный» в рамках комментария. И я хотел бы получить значение с регулярным выражением в скрипте Shell.

Мой код до сих пор:

#!/bin/bash 
conf=$(<"/etc/test.conf") # Get the file content 
regex='mode=(.*)$' # Set a regex 
if [[ $conf =~ $regex ]]; then # Search for the regex in the file 
    # We found it, so ... 
    echo "${BASH_REMATCH[1]}" # ... here is the value 
fi 

Моя большая проблема в том, что он не найдет значение :(
я попробовал много различных выражений регулярных выражений и протестировали их с https://regex101.com/, но мне кажется, что регулярное выражение interprator Shell отличается от pcre и python.

Мой лучшим решением было найти mode= и все после. Так есть ли способ получить только значение? ГНА rt легко ... найти mode=. Но как я могу сказать, что регулярное выражение оболочки, чтобы получить все за mode=до следующей очереди? и не далее этот разлом?
Что-то с \n (Unix LineBreak) и $ (конец строки) не работает для меня :(

Спасибо за помощь,
приветствия

+0

try 'mode = [^ \ n] +' где '[^ \ n]' соответствует чему-либо, что _isn't_ новой строке. Кроме того, вам нужно установить модификаторы в [tag: Shell]? –

+0

Я уже пробовал это, и когда я это делаю, он делает несколько строк. Может быть, еще одна строка, тогда '\ n'? – christopher2007

+0

может быть возвратом каретки. попробуйте 'mode = [^ \ r \ n]' вместо –

ответ

1

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

conf=$(<"/etc/test.conf") 
regex=$'mode=([^\n]*)' 
[[ $conf =~ $regex ]] && echo "${BASH_REMATCH[1]}" 

Выход:

dev 

Regex $'mode=([^\n]*)' будет соответствовать буквальному тексту mode=, за которым следует 0 или более символов, которые не являются \n.

+1

, который отлично поработал. большое спасибо :) – christopher2007

Смежные вопросы