Output.dat ファイルには次の内容があります。dn: uid=
との間の値を抽出する必要があります。,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
- 使ってみよう
値の代わりに行全体を返します。sed -e '/dn: uid=/,/,ou=/p' output.dat but
- 使用しようとすると
その後、次のエラーが発生します。sed -e '/dn: uid=/,/,ou=/\1/p' output.dat
sed: -e expression #1, char 18: unknown command: `\'
ベストアンサー1
PCRE()をサポートするGNU grepバージョンがある場合は、-P
次のことを意味するとします。最初起こった,ou
grep -oP '(?<=dn: uid=).+?(?=,ou=)' file
似合いたい場合第二 ,ou
non-greedy?
修飾子を削除できます。
grep -oP '(?<=dn: uid=).+(?=,ou=)' file
括弧内の式は長さ0のアサーション(別名周りを見てください) は一致の一部を構成しますが、結果の一部として返されないことを意味します。 Perlでも基本的に同じことができます。
perl -ne 'print "$1\n" if /(?<=dn: uid=)(.+?)(?=,ou=)/' file
何かできます。似たようなsedでは、一般(ゼロ以外の長さ)のグループ化を使用します。たとえば、GNU sedの場合、他のバリアントでは追加のエスケープが必要になることがあります。
sed -rn 's/(.*dn: uid=)([^,]+)(,ou=.*)/\2/p' file
または少し単純化
sed -rn 's/.*dn: uid=([^,]+),ou=.*/\1/p' file
sedには貪欲ではない一致オプションがないので、[^,]
これは少しハッキングです。
後で考える:これは正確に要求された操作を実行しませんが、実際に必要な操作はname=value
ファイルからコンマで区切られたペアを読み取り、最初のフィールドの値を名前からさらに分離するようです。以下を含むさまざまな方法でこれを達成できます。
awk -F, '{sub(".*=","",$1); print $1}' file
または、次の純粋なbashソリューション
while IFS=, read -r a b c d; do printf '%s\n' "${a#*=}"; done < file