Регулярное выражение для анализа общего имени по отличительному имени
Я пытаюсь разобрать 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>"(?:[^"]|"")+"|[^,]+))