Регулярное выражение для анализа общего имени по отличительному имени

Я пытаюсь разобрать sed) просто First Last из следующих DN, возвращенных DSCL команда в среде терминала OSX Bash...

CN=First Last,OU=PCS,OU=guests,DC=domain,DC=edu

Я пробовал несколько регулярных выражений с этого сайта и других с вопросами, очень близкими к тому, что я хотел... в основном с этим вопросом... Я старался, следуя советам, в меру своих возможностей (я не обязательно считаю себя новичком...но, безусловно, новичок в регулярных выражениях..)

DSCL возвращает список DN, и я хотел бы только иметь First Last печатается в текстовый файл. Я пытался использовать sed, но я не могу получить правильную функцию. Я открыт для других команд для анализа вывода. Каждая строка начинается с CN= а затем есть запятая между Last а также OU=,

Большое спасибо за Вашу помощь!

6 ответов

Решение

Используя sed:

sed 's/^CN=\([^,]*\).*/\1/' input_file
^           matches start of line 
CN=         literal string match
\([^,]*\)   everything until a comma
.*          rest

Я думаю, что все ответы на регулярные выражения, представленные до сих пор, являются ошибочными, поскольку они не обрабатывают должным образом символы "в кавычках" в общем имени. Например, рассмотрим отличительное имя как:

CN=Doe\, John,CN=Users,DC=example,DC=local

Лучше использовать настоящую библиотеку, способную анализировать компоненты Отличительное имя. Если вы ищете что-то быстрое в командной строке, попробуйте передать свой DN такой команде:

    echo "CN=Doe\, John,CN=Users,DC=activedir,DC=local" | python -c 'import ldap; import sys; print ldap.dn.explode_dn(sys.stdin.read().strip(), notypes=1)[0]'

(зависит от наличия установленной библиотеки python-ldap). Вы можете создать что-то подобное с помощью встроенной в PHP функции ldap_explode_dn().

Два cut команды, вероятно, самые простые (хотя и не обязательно лучшие):

DSCL | cut -d, -f1 | cut -d= -f2

Во-первых, разделить вывод из DSCL на запятых и напечатайте первое поле ("CN=First Last"); затем разделите это на знаки равенства и напечатайте второе поле.

http://www.gnu.org/software/gawk/manual/gawk.html

awk -v RS=',' -v FS='=' '$1=="CN"{print $2}' foo.txt

Мне тоже нравится awk, поэтому я печатаю подстроку из четвертого символа:

DSCL | awk '{FS=","}; {print substr($1,4)}' > filterednames.txt

Это регулярное выражение будет анализировать выдающееся имя, давая name а также val захват группы для каждого матча.

Когда строки DN содержат запятые, они должны быть заключены в кавычки - это регулярное выражение правильно обрабатывает как строки в кавычках, так и строки в кавычках, а также обрабатывает экранированные кавычки в строках в кавычках:

(?:^|,\s?)(?:(?<name>[A-Z]+)=(?<val>"(?:[^"]|"")+"|[^,]+))+

Вот красиво отформатировано:

(?:^|,\s?)
(?:
    (?<name>[A-Z]+)=
    (?<val>"(?:[^"]|"")+"|[^,]+)
)+

Вот ссылка, чтобы вы могли увидеть ее в действии: https://regex101.com/r/zfZX3f/2

Если вы хотите, чтобы регулярное выражение получало только CN, то эта адаптированная версия сделает это:

(?:^|,\s?)(?:CN=(?<val>"(?:[^"]|"")+"|[^,]+))

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