2012-06-22 125 views
2

我需要一个大的文件,用线如:sed的风格替换随机字母,数字字母随机数字

member: cn=user0001,ou=people 

替换所有的用户名,使得他们仍然有字母相同位置和数字在同一位置,随机。所以输出可能类似于:

member: cn=kvud7405,ou=people 

用户名的长度和格式不同,但它们总是以cn =和逗号为界。

任何人都可以提供sed/awk/bash的解决方案,或者失败的python可能是一个选项(不知道哪个版本)。

在此先感谢。

回答

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所以它工作时有额外的字段。

+0

谢谢。这看起来不错,但稍微移动了球门柱......我有这样的一些线条: – rich

+0

成员:cn = kvud7405,ou = people,dc = uk – rich

+1

@rich:是的,我对这个版本感觉不太好它不是很健壮。看我的编辑应该更好的版本。 –

5

sed -i 's/blah/blah?$(cat /dev/urandom | tr -dc "a-z0-9" | fold -w 6 | head -n 1)/g' /home/test.html 
+0

这是好的,但它似乎更清洁做'

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