免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 3897 | 回复: 10

[文本处理] 字符串替换为随机字符串 [复制链接]

论坛徽章:
3
天蝎座
日期:2013-12-10 19:37:11酉鸡
日期:2014-08-04 20:05:38双鱼座
日期:2014-08-09 21:53:54
发表于 2014-08-26 18:16 |显示全部楼层
本帖最后由 欧阳西风 于 2014-08-27 09:28 编辑

有如下文本,现在想把APhone1,APhone2等字符串替换为随即的10位字符串(仅包含字母或数字)。 我试过使用

  1. head -n 100 /dev/urandom| md5sum | head -c 10
复制代码
来产生随机字符串,但是使用sed替换过后字符串之间还是有规律的,不知道大家有没有能够做到替换过后字符串之间都没有关系?

  1. VERSION:2.1
  2. N:APhone1;;;;
  3. FN:APhone1
  4. TEL;CELL:15811258459
  5. --
  6. VERSION:2.1
  7. N:APhone2;;;;
  8. FN:APhone2
  9. TEL;CELL:15811258459
  10. --
  11. VERSION:2.1
  12. N:APhone3;;;;
  13. FN:APhone3
  14. TEL;CELL:15811258459
  15. --
  16. VERSION:2.1
  17. N:APhone4;;;;
  18. FN:APhone4
  19. TEL;CELL:15811258459
  20. --
  21. VERSION:2.1
  22. N:APhone5;;;;
  23. FN:APhone5
  24. TEL;CELL:15811258459
  25. --
  26. VERSION:2.1
  27. N:APhone6;;;;
  28. FN:APhone6
  29. TEL;CELL:15811258459
  30. --
  31. VERSION:2.1
  32. N:APhone7;;;;
  33. FN:APhone7
  34. TEL;CELL:15811258459
  35. --
  36. VERSION:2.1
  37. N:APhone8;;;;
  38. FN:APhone8
  39. TEL;CELL:15811258459
  40. --

复制代码

论坛徽章:
39
辰龙
日期:2013-08-21 15:45:192015亚冠之广州富力
日期:2015-05-12 16:34:52亥猪
日期:2015-03-03 17:22:00申猴
日期:2015-03-03 17:21:37未羊
日期:2014-10-10 13:45:41戌狗
日期:2014-06-17 09:53:29巨蟹座
日期:2014-06-12 23:17:17双鱼座
日期:2014-06-10 12:42:44寅虎
日期:2014-06-09 12:52:172015亚冠之卡尔希纳萨夫
日期:2015-05-24 15:24:35黄金圣斗士
日期:2015-12-02 17:25:0815-16赛季CBA联赛之吉林
日期:2017-06-24 16:43:52
发表于 2014-08-26 18:47 |显示全部楼层
你是怎么做的?

论坛徽章:
14
15-16赛季CBA联赛之辽宁
日期:2019-06-16 15:47:3515-16赛季CBA联赛之广夏
日期:2016-08-13 21:24:352015亚冠之武里南联
日期:2015-07-07 17:37:372015亚冠之萨济拖拉机
日期:2015-07-06 17:07:482015亚冠之全北现代
日期:2015-06-04 13:54:272015亚冠之城南
日期:2015-05-21 15:43:212015年亚洲杯之伊朗
日期:2015-04-25 18:20:362015年亚洲杯之伊朗
日期:2015-04-20 16:06:052015年亚洲杯之科威特
日期:2015-03-07 12:51:26丑牛
日期:2014-12-30 10:26:38申猴
日期:2014-09-28 22:40:18金牛座
日期:2014-09-13 21:12:22
发表于 2014-08-26 19:52 |显示全部楼层
本帖最后由 reb00t 于 2014-08-26 20:05 编辑
  1. <?php

  2. function gen_randomstr( $n=10 ) {
  3.     return substr(str_shuffle('abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'), 0, $n);
  4. }


  5. if(file_exists("200.txt")){

  6.     $f = fopen('200.txt','r');
  7.      while(!feof($f)){
  8.        $line = fgets($f);
  9.       $pa = '/APhone\d+/';
  10.       $randstr=gen_randomstr();
  11.       print preg_replace($pa, $randstr, $line);

  12.    }
  13. }else{

  14.         echo "file is not find";
  15. }

  16. ?>
复制代码
结果:
VERSION:2.1
N:H2pB5I1slx;;;;
FN:zBdgybCZe6
TEL;CELL:15811258459
--
VERSION:2.1
N:NcqkyH71ST;;;;
FN:JuVUPGgNC7
TEL;CELL:15811258459
--
VERSION:2.1
N:XKicRHaYxf;;;;
FN:S0rLDdVntv
TEL;CELL:15811258459
--
VERSION:2.1
N:Ke8YJIQMPl;;;;
FN:LFlhSEyvWm
TEL;CELL:15811258459
--
VERSION:2.1
N:ivxonObMB6;;;;
FN:2IAKLj6iV7
TEL;CELL:15811258459
--
VERSION:2.1
N:NGB4UVg7H8;;;;
FN:KvlCQ6c1iz
TEL;CELL:15811258459
--
VERSION:2.1
N:2JLSKCj5Eb;;;;
FN:I9LBPS56b8
TEL;CELL:15811258459
--
VERSION:2.1
N:6IsX0HNRxt;;;;
FN:6fveyFOQdZ
TEL;CELL:15811258459
--[Finished in 0.2s]

论坛徽章:
3
天蝎座
日期:2013-12-10 19:37:11酉鸡
日期:2014-08-04 20:05:38双鱼座
日期:2014-08-09 21:53:54
发表于 2014-08-27 09:04 |显示全部楼层
回复 2# 关阴月飞


    我的做法是如下:

  1. random_str() {
  2. head -n 100 /dev/urandom| md5sum | head -c 10
  3. }
  4. sed -i "/APhone[0-9]\+/s//$(random_str)/g" a.txt
复制代码

论坛徽章:
3
天蝎座
日期:2013-12-10 19:37:11酉鸡
日期:2014-08-04 20:05:38双鱼座
日期:2014-08-09 21:53:54
发表于 2014-08-27 09:05 |显示全部楼层
回复 3# reb00t


    我想用 shell来实现,不是使用php。不过还是谢谢

论坛徽章:
39
辰龙
日期:2013-08-21 15:45:192015亚冠之广州富力
日期:2015-05-12 16:34:52亥猪
日期:2015-03-03 17:22:00申猴
日期:2015-03-03 17:21:37未羊
日期:2014-10-10 13:45:41戌狗
日期:2014-06-17 09:53:29巨蟹座
日期:2014-06-12 23:17:17双鱼座
日期:2014-06-10 12:42:44寅虎
日期:2014-06-09 12:52:172015亚冠之卡尔希纳萨夫
日期:2015-05-24 15:24:35黄金圣斗士
日期:2015-12-02 17:25:0815-16赛季CBA联赛之吉林
日期:2017-06-24 16:43:52
发表于 2014-08-27 09:38 |显示全部楼层
本帖最后由 关阴月飞 于 2014-08-27 09:42 编辑

回复 4# 欧阳西风

试试这个:
假设一行中只有一个需要替换的地方,先按文件行数,生成多个随机数,确保随机数够用,再进行替换:
  1. awk 'FNR==NR{a[FNR]=$0;next}{sub(/APhone[0-9]+/,a[FNR])}1'  <(tr -dc A-Za-z0-9 < /dev/urandom |fold -w 10|head -`grep -c . urfile`)  urfile
复制代码
  1. [root@ awktest]# awk 'FNR==NR{a[FNR]=$0;next}{sub(/APhone[0-9]+/,a[FNR])}1'  <(tr -dc A-Za-z0-9 < /dev/urandom |fold -w 10|head -`grep -c . file`)  file
  2. VERSION:2.1
  3. N:IPUQD4awVc;;;;
  4. FN:fEiw7VgnNb
  5. TEL;CELL:15811258459
  6. --
  7. VERSION:2.1
  8. N:IR00FpQ1nT;;;;
  9. FN:eIurVieVBG
  10. TEL;CELL:15811258459
  11. --
  12. VERSION:2.1
  13. N:j3UqBXV877;;;;
  14. FN:sklN5iXnHV
  15. TEL;CELL:15811258459
  16. --
  17. VERSION:2.1
  18. N:bG0nnVURis;;;;
  19. FN:wxkvgmNhDD
  20. TEL;CELL:15811258459
  21. --
  22. VERSION:2.1
  23. N:F6y77g3m64;;;;
  24. FN:SMbol0yROF
  25. TEL;CELL:15811258459
  26. --
  27. VERSION:2.1
  28. N:WD6pjZ3hh4;;;;
  29. FN:K2vEAVz47b
  30. TEL;CELL:15811258459
  31. --
  32. VERSION:2.1
  33. N:3JpoqZ31lT;;;;
  34. FN:CShA6XXRKn
  35. TEL;CELL:15811258459
  36. --
  37. VERSION:2.1
  38. N:Q7Uibxe9wL;;;;
  39. FN:fyteac8H4i
  40. TEL;CELL:15811258459
  41. --
复制代码

论坛徽章:
735
金牛座
日期:2014-02-26 17:49:58水瓶座
日期:2014-02-26 18:10:15白羊座
日期:2014-04-15 19:29:52寅虎
日期:2014-04-17 19:43:21酉鸡
日期:2014-04-19 21:24:10子鼠
日期:2014-04-22 13:55:24卯兔
日期:2014-04-22 14:20:58亥猪
日期:2014-04-22 16:13:09狮子座
日期:2014-05-05 22:31:17摩羯座
日期:2014-05-06 10:32:53处女座
日期:2014-05-12 09:23:11子鼠
日期:2014-05-21 18:21:27
发表于 2014-08-27 11:29 |显示全部楼层
本帖最后由 Herowinter 于 2014-08-27 11:37 编辑

回复 1# 欧阳西风

如果N:和FN:后面的两个随机字符串不需要确保一样,用楼上PF大神的就行,
否则可以考虑这段代码.
  1. awk 'function randomStr(a,n){str="";for(i=1;i<=10;i++){str=str""a[int(rand()*100%n)]};return str} BEGIN{for(i=48;i<=122;i++)if((i<=57)||(i>=65&&i<=90)||(i>=97))a[n++]=sprintf("%c",i);srand()} /APhone[0-9]+/{phone=gensub(/.*(APhone[0-9]+).*/,"\\1",1);if(!(phone in b))b[phone]=randomStr(a,n);sub(phone,b[phone])}1' i
  2. SION:2.1
  3. N:0GJOr7OtPM;;;;
  4. FN:0GJOr7OtPM
  5. TEL;CELL:15811258459
  6. --
  7. VERSION:2.1
  8. N:arpip958MT;;;;
  9. FN:arpip958MT
  10. TEL;CELL:15811258459
  11. --
  12. VERSION:2.1
  13. N:YCsHenY2Pw;;;;
  14. FN:YCsHenY2Pw
  15. TEL;CELL:15811258459
  16. --
  17. VERSION:2.1
  18. N:Jr7RED7d0E;;;;
  19. FN:Jr7RED7d0E
  20. TEL;CELL:15811258459
  21. --
  22. VERSION:2.1
  23. N:L78F0F1UW1;;;;
  24. FN:L78F0F1UW1
  25. TEL;CELL:15811258459
  26. --
  27. VERSION:2.1
  28. N:QGsa78p9F4;;;;
  29. FN:QGsa78p9F4
  30. TEL;CELL:15811258459
  31. --
  32. VERSION:2.1
  33. N:vB1Q4OA29X;;;;
  34. FN:vB1Q4OA29X
  35. TEL;CELL:15811258459
  36. --
  37. VERSION:2.1
  38. N:ocNxD39z8c;;;;
  39. FN:ocNxD39z8c
  40. TEL;CELL:15811258459
  41. --
复制代码

论坛徽章:
3
天蝎座
日期:2013-12-10 19:37:11酉鸡
日期:2014-08-04 20:05:38双鱼座
日期:2014-08-09 21:53:54
发表于 2014-08-27 12:28 |显示全部楼层
回复 6# 关阴月飞


    谢谢,可以实现我要的效果

论坛徽章:
3
天蝎座
日期:2013-12-10 19:37:11酉鸡
日期:2014-08-04 20:05:38双鱼座
日期:2014-08-09 21:53:54
发表于 2014-08-27 12:30 |显示全部楼层
回复 7# Herowinter


    不需要保证N和FN后面的字符串保持一致,不过保持一致也非常好。谢谢了

论坛徽章:
735
金牛座
日期:2014-02-26 17:49:58水瓶座
日期:2014-02-26 18:10:15白羊座
日期:2014-04-15 19:29:52寅虎
日期:2014-04-17 19:43:21酉鸡
日期:2014-04-19 21:24:10子鼠
日期:2014-04-22 13:55:24卯兔
日期:2014-04-22 14:20:58亥猪
日期:2014-04-22 16:13:09狮子座
日期:2014-05-05 22:31:17摩羯座
日期:2014-05-06 10:32:53处女座
日期:2014-05-12 09:23:11子鼠
日期:2014-05-21 18:21:27
发表于 2014-08-27 13:23 |显示全部楼层
回复 9# 欧阳西风

那样,我的代码可以改成这样.
  1. awk 'function randomStr(a,n){str="";for(i=1;i<=10;i++){str=str""a[int(rand()*100%n)]};return str} BEGIN{for(i=48;i<=122;i++)if((i<=57)||(i>=65&&i<=90)||(i>=97))a[n++]=sprintf("%c",i);srand()} /APhone[0-9]+/{sub(/APhone[0-9]+/,randomStr(a,n))}1' i
  2. SION:2.1
  3. N:bPmD0FoAMk;;;;
  4. FN:F4eQhESVCX
  5. TEL;CELL:15811258459
  6. --
  7. VERSION:2.1
  8. N:wjEY69aTDQ;;;;
  9. FN:L8oACSZ9a4
  10. TEL;CELL:15811258459
  11. --
  12. VERSION:2.1
  13. N:6XLGAavYgS;;;;
  14. FN:y4Jo9r5RRO
  15. TEL;CELL:15811258459
  16. --
  17. VERSION:2.1
  18. N:xFjK8IVWlZ;;;;
  19. FN:8s1GLzoV7y
  20. TEL;CELL:15811258459
  21. --
  22. VERSION:2.1
  23. N:s40w4IFLVT;;;;
  24. FN:LYN6ERbBeb
  25. TEL;CELL:15811258459
  26. --
  27. VERSION:2.1
  28. N:86BIpAp0au;;;;
  29. FN:qXOlDWiG7b
  30. TEL;CELL:15811258459
  31. --
  32. VERSION:2.1
  33. N:QG2zdM5buQ;;;;
  34. FN:K64aST8TTf
  35. TEL;CELL:15811258459
  36. --
  37. VERSION:2.1
  38. N:Y42INNim5K;;;;
  39. FN:3YQ96ryb21
  40. TEL;CELL:15811258459
  41. --
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP