V souboru Output.dat mám následující. Potřebuji extrahovat hodnotu mezi dn: uid=
a ,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
- Zkoušel jsem použít
sed -e '/dn: uid=/,/,ou=/p' output.dat but
vrací celý řádek místo hodnoty.
- Při pokusu o použití
sed -e '/dn: uid=/,/,ou=/1/p' output.dat
pak došlo k následující chybě:
sed: -e expression #1, char 18: unknown command: `'
Přijatá odpověď:
Pokud máte verzi GNU grep s PCRE (-P
) podporu, pak za předpokladu, že máte na mysli první výskyt ,ou
grep -oP '(?<=dn: uid=).+?(?=,ou=)' file
Pokud se chcete shodovat do druhé ,ou
můžete odstranit nenasytný ?
modifikátor
grep -oP '(?<=dn: uid=).+(?=,ou=)' file
Výrazy v závorkách jsou tvrzení s nulovou délkou (neboli rozhledy ), což znamená, že tvoří součást zápasu, ale nejsou vráceny jako součást výsledku. Totéž můžete udělat nativně v perlu, např.
perl -ne 'print "$1n" if /(?<=dn: uid=)(.+?)(?=,ou=)/' file
Je možné udělat něco podobného v sed, pomocí pravidelného seskupení (bez nulové délky), např. (pro GNU sed – jiné odrůdy mohou vyžadovat další escapování)
sed -rn 's/(.*dn: uid=)([^,]+)(,ou=.*)/2/p' file
nebo mírné zjednodušení
sed -rn 's/.*dn: uid=([^,]+),ou=.*/1/p' file
Všimněte si [^,]
je zde trochu hack, protože sed nemá možnost skutečného nenasytného shody.
Následný nápad :ačkoli to není přesně to, na co jste se ptali, vypadá to, že to, co ve skutečnosti chcete udělat, je číst name=value
oddělené čárkami páry ze souboru a poté dále oddělit hodnotu prvního pole od jeho názvu. Můžete toho dosáhnout mnoha způsoby – včetně
awk -F, '{sub(".*=","",$1); print $1}' file
nebo čistě bash řešení, jako je
while IFS=, read -r a b c d; do printf '%sn' "${a#*=}"; done < file