免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: xiaozi0lei
打印 上一主题 下一主题

【结贴】perl正则表达式替换字符为空 [复制链接]

论坛徽章:
0
11 [报告]
发表于 2013-05-05 10:43 |只看该作者
谢谢Perlvim
你说的很有道理,读写都操作一个问题,的确既不安全也可能存在问题。我就不纠结这个问题了,还是设置成两个文件,一个读,一个写。这样保险也清晰。
非常感谢你! Perlvim

回复 10# Perlvim


   

论坛徽章:
0
12 [报告]
发表于 2013-05-05 10:43 |只看该作者
你们说的对,数据安全最重要,呵呵

回复 11# b114213903


   

论坛徽章:
2
巨蟹座
日期:2014-05-21 16:42:40巳蛇
日期:2014-05-22 08:44:29
13 [报告]
发表于 2013-05-06 13:56 |只看该作者
请问楼主你的问题解决了吗?如何跳过一行呢?把代码贴出来让俺瞅瞅呗,急需...

论坛徽章:
0
14 [报告]
发表于 2013-05-10 17:41 |只看该作者
就是Perlvim兄弟说的方法,如下他的code。
读取log1文件的每一行,循环匹配正则表达式,然后把不满足的写入log2文件。
  1. #!/usr/bin/perl -w

  2. open FILE,"log1";
  3. open F2,">log2";

  4. foreach (<FILE>){
  5.   next if /\(a\)/;            #此处匹配正则表达式,如果满足条件就跳过。next关键字是“直接进入下一次循环”。
  6.   print F2;
  7. }

  8. close F2;
  9. close FILE;
复制代码
回复 14# skyyy90


   

论坛徽章:
0
15 [报告]
发表于 2013-05-10 22:13 |只看该作者
回复 1# xiaozi0lei
首先FILE文件句柄加载了log里面的东西
然后F2用了open(文件句柄,"+<文件名"),通过“+<”模式,你可以既可以读文件,又可以写文件。你可以通过tell() 函数在文件内部移动,通过seek()函数进行定位。如果文件不存在,就会被创建。如果文件已经存在,原来的数据不会被清除。
   

论坛徽章:
0
16 [报告]
发表于 2013-05-10 22:37 |只看该作者
回复 1# xiaozi0lei

我给你一个彻底的分析:
比如说我log里面原来是ddd(a)fffg
首先第一个FIEL读入文件log,这里行串是应当是“ddd(a)fffg\n"--注意\n会被加载的,占两个字符
然后,第二个F2读入文件log,这里行串也是"ddd(a)fffg\n"--注意\n会被加载的,占两个字符
接着,FIEL里面的行被处理,去掉了(a)这个表达式,剩下在$_里面的是dddfffg\n九个字符。
然后,$_被写入到F2里面去,F2里面的原来的字符串会被从头开始重写结果是:
F2里原来的串:ddd(a)fffg\n
被替换后的串 :dddfffg\ng\n
然后写入到log文件里结果是:
dddfffg
g
   

论坛徽章:
0
17 [报告]
发表于 2013-05-10 22:42 |只看该作者
回复 1# xiaozi0lei

对于你的第一个例子你log 是(a)
其实FILE读入的是(a)\n, F2也读入(a)\n
然后FILE替换后变成\n,然后写入F2,变成了\na)\n,写入文件后就是
空行
a)

   

论坛徽章:
0
18 [报告]
发表于 2013-05-13 17:32 |只看该作者
本帖最后由 xiaozi0lei 于 2013-05-13 17:34 编辑

非常感谢shuiyi193202的解答,你说的很有道理,而且在unix下的试验结果,和你说的一模一样。不过unix下"\n"是不是应该是只占有一个字符的位置。
因为咱们得到的结果是
-----
空行
a)
-----
上面相当于"\n"字符取代了左括号"(",然后第二行是"a)\n"。

再次感谢兄弟的解释,很清楚,明白。

另:请教一个问题
我发现unix下和windows下的文本处理工具对"(a)"貌似处理不同。和上面一样的perl脚本,一样的log。
如果我用notepad++编辑的话,脚本就不认识log文件中的"(a)"。但是如果换成gvim的话,perl脚本就可以对log中的"(a)"进行处理,但是处理结果和unix下是不一样的。就像你上面所说的,window下把"\n"当成了两个字符来对待。得到的结果如下:
-----
空行
)
-----
上面相当于"\n"字符取代了左括号和字符a"(a",然后第二行是")\n"。//这里用中文的右括号表示一下,英文就变成""这个表情了。。
这是不是说明windows平台和unix平台对字符编码的处理是有差异的,望指教一下,谢谢
再次感谢shuiyi193202 兄的解答

回复 18# shuiyi193202


   

论坛徽章:
0
19 [报告]
发表于 2013-05-15 13:37 |只看该作者
回复 19# xiaozi0lei
因为在windows换行符是\r\n,两个字符,相当于unix下面的\n

   

论坛徽章:
7
戌狗
日期:2013-12-15 20:43:38技术图书徽章
日期:2014-03-05 01:33:12技术图书徽章
日期:2014-03-15 20:31:17未羊
日期:2014-03-25 23:48:20丑牛
日期:2014-04-07 22:37:44巳蛇
日期:2014-04-11 21:58:0915-16赛季CBA联赛之青岛
日期:2016-03-17 20:36:13
20 [报告]
发表于 2013-05-15 15:29 |只看该作者
xiaozi0lei 发表于 2013-05-05 06:43
你们说的对,数据安全最重要,呵呵

回复 11# b114213903
你说的很有道理,非常感谢你。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP