Linux - ファイル行で特定のパターンのすべての発生を検索します。

Linux - ファイル行で特定のパターンのすべての発生を検索します。

Linuxには、次の行を含むファイルがあります。

(memberOf=CN=Group1)(memberOf=CN=Group2)(memberOf=CN=Group3)(memberOf=CN=Group4)

私の目標は、その行のグループのリストを埋めることです。たとえば、次のようになります。

Group1

Group2

Group3

Group4

ベストアンサー1

with pcregrep( PerlC互換R正規E表現grep):

pcregrep -io1 '\(memberOf=CN=(.*?)\)'

または直接使用してくださいperl

perl -lne 'print $1 while /\(memberOf=CN=(.*?)\)/gi'

(ここでは、LDAP属性名として使用されているか、-iフラグは大文字と小文字を区別しません。)i

grep実装がそのオプションをサポートしている場合-PgrepPCREサポートでビルドするときにGNUがサポートするように)、非標準オプションもサポートする可能性が高く、-o次のことができます。

grep -iPo '\(memberOf=CN=\K.*?(?=\))'

他の実装は出力キャプチャグループをサポートしていないため、ここでおよびのプレビュー\K演算子は、およびが出力(memberOf=CN=)含まれていないことを示すために使用されます。greppcregrep

POSIXユーティリティを使用すると、ほぼ同じことができます。

sed -n '
  /([mM][eE][mM][bB][eE][rR][Oo][fF]=[Cc][Nn]=\([^)]*\))\(.*\)/ {
    s//\
\1\
\2/
    s/.*\n\(.*\n\)/\1/
    P;D
  }'

文字列がシェルスカラー変数に格納されていて、結果のグループをシェル配列変数に保存する場合は、シェルを使用して次のことをzsh実行できます。

set -o extendedglob

string='(memberOf=CN=Group1)(memberOf=CN=Group2)(memberOf=CN=Group3)(memberOf=CN=Group4)'
groups=()

: ${string//(#ib)[(]memberOf=CN=([^)]#)[)]/${groups[$#groups+1]=$match[1]}}

またはGNUから入手してくださいgrep

groups=(
  ${(0)"$(
    print -rN -- $string |
      grep -ziPo '\(memberOf=CN=\K.*?(?=\))'
  )"}
)

Bash 4.4+と同じ:

readarray -td '' groups < <(
  printf '%s\0' "$string" |
    grep -ziPo '\(memberOf=CN=\K.*?(?=\))'
) && wait "$!"

おすすめ記事