2014-12-08 2 views
2

Для проверки, установлена ​​или нет переменная в известном файле конфигурации.Регулярное выражение для файлов конфигурации unix

Мне нужно регулярное выражение, которое соответствует var=1, но не # var=1. Мои попытки не работают. Могу ли я кому-нибудь помочь, пожалуйста?

^(?<!#).*var.* # соответствует как var=1 и # var=1

EDIT: последующая регулярное выражение решить эту проблему в регулярных выражений тестера (regxlib.com), но Grep не находит строку grep "^[^#].+(?<=var.*)" ~/testfile.conf

testfile.conf
#var=1 export var=2 export foo=2

Кто-нибудь знает, почему это в grep не работает?

EDIT2: Следующее выражение, похоже, решает мою проблему.

grep "^[^#]*var" ~/testfile.conf resp.
sed -n "/^[^#]*var/p" ~/testfile.conf

+3

Что вы пробовали? Я думаю, вы имеете в виду '(?

+0

Что вы тоже используете для этого? – anubhava

ответ

1

Это должно работать на то, что вы указали.

/^[^#].+/gm 

Если вам нужно "=" тоже используют этот

/^[^#].+=.+/gm 

Доказательство

http://www.regexr.com/3a1jp


EDIT после @mtm, что предложенное избежать чистых помещений, так /^[^#]*[^#\s]+\s*=\s*[^#\s]+/gmis another good choice. Помните, что усеченные декларации, а foo = #123 также недействителен в файле конфигурации ...

Но если вы используете grep с по умолчанию регулярное выражение, то + не является оператором (должны быть экранированы), и общие пространства должны быть выраженное [:space:].Некоторые способы использовать полное регулярное выражение,

grep "^[^#]*[^#[:space:]]\+[[:space:]]*=[[:space:]]*[^#[:space:]]\+" config 
grep -E "^[^#]*[^#[:space:]]+[[:space:]]*=[[:space:]]*[^#[:space:]]+" config 
grep -P "^[^#]*[^#\s]+\s*=\s*[^#\s]+" config 

более простой и точный, чтобы проверить реальный синтаксис файла конфигурации, возможно, [email protected],1=1 является недействительным, так

grep -P "^\s*\w+\s*=\s*[^\s#]+" config 

будет простым и лучшим выбором ,

+0

спасибо. Я изменил ваше предложение - я думаю, мне нужно следовать регулярному выражению «^ [^ #]. + (? <= Var. *)" <# Var = 1 \ n var = 2 \ n foo = 2 " – Taiskorgon

+0

@Taiskorgon: вам не нужно использовать lookbehind. '/^* var =. */gm' должно быть достаточно. –

0

В Perl Compatible Regular Expression, позволяющий пробелы до и между именем атрибута, а затем фиксируя как имя, так и значение.

/^\s*([\w]+)\s*=\s*(.+)/ 

Как вы добавили, что вы используете grep, PCRE может быть запущена с grep -P, если ваш grep поддерживает, что

То же в основном POSIX регулярных выражений (который будет работать в большинстве реализаций Grep):

grep "^ *[_[:alnum:]]\+ *= *.\+" config 
+0

... 'grep' является POSIX, [вам нужно' grep -P'] (http://stackoverflow.com/a/1074977/287948) использовать PCRE –

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