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: `'
承認された回答:
PCRE(-P
)を備えたバージョンのGNUgrepを使用している場合 )サポートし、最初のを意味すると仮定します ,ou
の出現
grep -oP '(?<=dn: uid=).+?(?=,ou=)' file
秒まで一致させたい場合 ,ou
貪欲でない?
を削除できます 修飾子
grep -oP '(?<=dn: uid=).+(?=,ou=)' file
括弧内の式は、長さがゼロのアサーション(別名 lookarounds )です。 )それらは一致の一部を形成しますが、結果の一部として返されません。同じことをperlでネイティブに行うことができます。例:
perl -ne 'print "$1n" 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 '%sn' "${a#*=}"; done < file