同じ行にある2つの検索パターン間の値を抽出します。

同じ行にある2つの検索パターン間の値を抽出します。

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

似合いたい場合第二 ,ounon-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 

おすすめ記事