2

次のような行を含む大きなファイルを取得する必要があります。

member: cn=user0001,ou=people

そして、ランダムに、同じ位置に文字と同じ位置に数字があるように、すべてのユーザー名を置き換えます。したがって、出力は次のようになります。

member: cn=kvud7405,ou=people

ユーザー名の長さと形式はさまざまですが、常に cn= とカンマで区切られています。

誰でも sed/awk/bash を使用して解決策を提供できますか、または python がオプションである可能性があります (バージョンがわからない)。

前もって感謝します。

4

3 に答える 3

5

何かのようなもの

sed -i 's/blah/blah?$(cat /dev/urandom | tr -dc "a-z0-9" | fold -w 6 | head -n 1)/g' /home/test.html
于 2012-06-22T14:21:24.560 に答える
3
awk -F 'cn=|,' 'BEGIN {srand(); OFS = ""} {n = split($2, a, ""); for (i = 1; i <= n; i++) {if (a[i] ~ /[[:digit:]]/) {new = new int(rand() * 10)} else {new = new sprintf("%c", int(rand() * 26 + 97))}}; $2 = "cn=" new ","; print}'

複数の行に分かれています:

awk -F 'cn=|,' '
    BEGIN {
        srand(); 
        OFS = ""
    } 
    {
        n = split($2, a, ""); 
        for (i = 1; i <= n; i++) {
            if (a[i] ~ /[[:digit:]]/) {
                new = new int(rand() * 10)
            }
            else {
                new = new sprintf("%c", int(rand() * 26 + 97))
            }
        }; 
        $2 = "cn=" new ","; 
        print
}'

必要に応じて、大文字の英字を処理するように簡単に変更できます。

編集:

より堅牢:

awk 'BEGIN {srand()} {match($0, /cn=[^,]*,/); n = split(substr($0, RSTART+3, RLENGTH-4), a, ""); for (i = 1; i <= n; i++) {if (a[i] ~ /[[:digit:]]/) {new = new int(rand() * 10)} else {new = new sprintf("%c", int(rand() * 26 + 97))}}; print substr($0, 1, RSTART+2) new substr($0, RSTART+RLENGTH-1)}'

このバージョンは使用しないFSため、追加のフィールドがある場合に機能します。

于 2012-06-22T14:36:47.127 に答える
1

Bash ソリューション:

letter=( a b c d e f g h i j k l m n o p q r s t u v w x y z )
digit=( 0 1 2 3 4 5 6 7 8 9 0 )
while read line; do
  user=''
  line=${line#*=}                           # separate cn-value
  line=${line%,*}                           # separate cn-value
  for (( CNTR=0; CNTR<${#line}; CNTR+=1 )); do
    if [[ ${line:CNTR:1} =~ [[:alpha:]] ]] ; then
      user=$user${letter[RANDOM%26]}
    else
      user=$user${digit[RANDOM%10]}
    fi
  done
  echo  "member: cn=${user},ou=people"
done < "$infile" > "$tempfile"

mv "$tempfile" "$infile"                    # replace original file
于 2012-06-22T15:59:11.013 に答える