4

OSXターミナルのbash環境でコマンドによって返された次のDNから(を使用してsed)解析しようとしています...First LastDSCL

CN=First Last,OU=PCS,OU=guests,DC=domain,DC=edu

私はこのサイトや他のサイトから、私が望んでいたものに非常に近い質問で複数の正規表現を試しました...主にこの質問...私は自分の能力の限りを尽くしてアドバイスに従うことを試みました(私は必ずしも自分自身を初心者とは見なしません。 ..しかし、間違いなく正規表現の初心者です..)

DSCLFirst LastDNのリストを返しますが、テキストファイルにのみ印刷したいと思います。を使ってみsedましたが、うまく機能しないようです。私は出力を解析するために他のコマンドを開いています。すべての行はで始まりCN=、その後、との間にコンマがLastありOU=ます。

ご助力ありがとうございます!

4

6 に答える 6

6

これまでに提供された正規表現の回答はすべて、一般名の引用符で囲まれた「、」文字を適切に処理しない限り、バグがあると思います。たとえば、次のようなdistinguishedNameについて考えてみます。

CN=Doe\, John,CN=Users,DC=example,DC=local

DistinguishedNameのコンポーネントを解析できる実際のライブラリを使用することをお勧めします。コマンドラインですばやく何かを探している場合は、DNを次のようなコマンドにパイプしてみてください。

    echo "CN=Doe\, John,CN=Users,DC=activedir,DC=local" | python -c 'import ldap; import sys; print ldap.dn.explode_dn(sys.stdin.read().strip(), notypes=1)[0]'

(python-ldapライブラリがインストールされているかどうかによって異なります)。PHPの組み込みのldap_explode_dn()関数を使って似たようなものを作ることができます。

于 2013-04-30T13:37:17.117 に答える
2

2つのcutコマンドがおそらく最も単純です(必ずしも最良ではありませんが)。

DSCL | cut -d, -f1 | cut -d= -f2

まず、出力をコンマで分割しDSCL、最初のフィールドを出力します( "CN = First Last"); 次に、等号でそれを分割し、2番目のフィールドを印刷します。

于 2012-07-20T15:48:54.080 に答える
1

sedの使用:

sed 's/^CN=\([^,]*\).*/\1/' input_file
^           matches start of line 
CN=         literal string match
\([^,]*\)   everything until a comma
.*          rest
于 2012-07-20T15:57:19.377 に答える
1

http://www.gnu.org/software/gawk/manual/gawk.html#Field-Separators

awk -v RS=',' -v FS='=' '$1=="CN"{print $2}' foo.txt
于 2012-07-20T16:37:48.787 に答える
0

私もawkが好きなので、4番目の文字の部分文字列を出力します。

DSCL | awk '{FS=","}; {print substr($1,4)}' > filterednames.txt

于 2012-07-22T17:24:34.077 に答える
0

この正規表現は、識別された名前を解析し、一致ごとにグループを指定してキャプチャしますnameval

DN文字列にコンマが含まれている場合、それらは引用符で囲まれていることを意味します。この正規表現は、引用符で囲まれた文字列と引用符で囲まれていない文字列の両方を正しく処理し、引用符で囲まれた文字列のエスケープされた引用符も処理します。

(?:^|,\s?)(?:(?<name>[A-Z]+)=(?<val>"(?:[^"]|"")+"|[^,]+))+

これはうまくフォーマットされています:

(?:^|,\s?)
(?:
    (?<name>[A-Z]+)=
    (?<val>"(?:[^"]|"")+"|[^,]+)
)+

動作を確認できるリンクは次のとおりです: https ://regex101.com/r/zfZX3f/2

正規表現でCNのみを取得する場合は、この適合バージョンで次のようになります。

(?:^|,\s?)(?:CN=(?<val>"(?:[^"]|"")+"|[^,]+))

于 2018-04-03T10:20:33.953 に答える