Linuxには、次の行を含むファイルがあります。
(memberOf=CN=Group1)(memberOf=CN=Group2)(memberOf=CN=Group3)(memberOf=CN=Group4)
私の目標は、その行のグループのリストを埋めることです。たとえば、次のようになります。
Group1
Group2
Group3
Group4
ベストアンサー1
with pcregrep
( P
erlC
互換R
正規E
表現grep
):
pcregrep -io1 '\(memberOf=CN=(.*?)\)'
または直接使用してくださいperl
。
perl -lne 'print $1 while /\(memberOf=CN=(.*?)\)/gi'
(ここでは、LDAP属性名として使用されているか、-i
フラグは大文字と小文字を区別しません。)i
grep
実装がそのオプションをサポートしている場合-P
(grep
PCREサポートでビルドするときにGNUがサポートするように)、非標準オプションもサポートする可能性が高く、-o
次のことができます。
grep -iPo '\(memberOf=CN=\K.*?(?=\))'
他の実装は出力キャプチャグループをサポートしていないため、ここでおよびのプレビュー\K
演算子は、およびが出力(memberOf=CN=
に)
含まれていないことを示すために使用されます。grep
pcregrep
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 "$!"