Se você tem uma versão do GNU grep com suporte a PCRE ( -P
), então assume que você quer dizer a ocorrência primeiro de ,ou
grep -oP '(?<=dn: uid=).+?(?=,ou=)' file
Se você quiser corresponder ao segundo ,ou
, é possível remover o modificador ?
não-ambicioso
grep -oP '(?<=dn: uid=).+(?=,ou=)' file
As expressões entre parênteses são asserções de comprimento zero (também conhecidas como lookarounds ), o que significa que elas fazem parte da correspondência, mas não são retornadas como parte do resultado. Você poderia fazer a mesma coisa nativamente em perl, por exemplo,
perl -ne 'print "$1\n" if /(?<=dn: uid=)(.+?)(?=,ou=)/' file
É possível fazer algo similar em sed, usando o agrupamento regular (sem comprimento zero), por ex. (para o GNU sed - outras variedades podem precisar de escape adicional)
sed -rn 's/(.*dn: uid=)([^,]+)(,ou=.*)//p' file
ou simplificando ligeiramente
sed -rn 's/.*dn: uid=([^,]+),ou=.*//p' file
Observe que o [^,]
é um truque aqui, já que o sed não tem uma opção de correspondência não voraz verdadeira.
> Afterthought : embora não seja exatamente o que você perguntou, parece que o que você realmente quer fazer é ler name=value
pares separados por vírgulas de um arquivo e, em seguida, dividir ainda mais o valor do primeiro campo de seu nome. Você pode conseguir isso de muitas maneiras - incluindo
awk -F, '{sub(".*=","",$1); print $1}' file
ou uma solução pura como
while IFS=, read -r a b c d; do printf '%s\n' "${a#*=}"; done < file