Ho quanto segue in un file Output.dat. Devo estrarre il valore tra dn: uid=
e ,ou=
dn: uid=user1,ou=Active,ou=Member,dc=domain,dc=org
dn: [email protected],ou=Active,ou=Member,dc=domain,dc=org
dn: uid=usertest,ou=Active,ou=Member,dc=domain,dc=org
dn: uid=abc1,ou=Active,ou=Member,dc=domain,dc=org
- Ho provato a usare
sed -e '/dn: uid=/,/,ou=/p' output.dat but
restituisce la riga completa anziché il valore.
- Quando si tenta di utilizzare
sed -e '/dn: uid=/,/,ou=/1/p' output.dat
quindi ha ottenuto il seguente errore:
sed: -e expression #1, char 18: unknown command: `'
Risposta accettata:
Se hai una versione di GNU grep con PCRE (-P
) supporto, quindi supponendo che tu intenda il primo occorrenza di ,ou
grep -oP '(?<=dn: uid=).+?(?=,ou=)' file
Se vuoi abbinare fino al secondo ,ou
puoi rimuovere il ?
non avido modificatore
grep -oP '(?<=dn: uid=).+(?=,ou=)' file
Le espressioni tra parentesi sono asserzioni a lunghezza zero (ovvero lookaround ) significa che fanno parte della corrispondenza, ma non vengono restituiti come parte del risultato. Potresti fare la stessa cosa in modo nativo in perl, ad es.
perl -ne 'print "$1n" if /(?<=dn: uid=)(.+?)(?=,ou=)/' file
È possibile fare qualcosa di simile in sed, usando il raggruppamento regolare (di lunghezza diversa da zero), ad es. (per GNU sed – altre varietà potrebbero aver bisogno di un'escape aggiuntivo)
sed -rn 's/(.*dn: uid=)([^,]+)(,ou=.*)/2/p' file
o semplificando leggermente
sed -rn 's/.*dn: uid=([^,]+),ou=.*/1/p' file
Nota il [^,]
è un po' un trucco qui, dal momento che sed non ha una vera opzione di corrispondenza non avida.
Ripensamento :anche se non è esattamente quello che hai chiesto, sembra che quello che vuoi fare sia leggere name=value
separati da virgole coppie da un file, quindi dividere ulteriormente il valore del primo campo dal suo nome. Potresti ottenerlo in molti modi, incluso
awk -F, '{sub(".*=","",$1); print $1}' file
o una soluzione pure-bash come
while IFS=, read -r a b c d; do printf '%sn' "${a#*=}"; done < file