免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3181 | 回复: 5
打印 上一主题 下一主题

字符串匹配修改,求助 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-12-30 11:37 |只看该作者 |倒序浏览
一个文件的内容如下:
#a = 1,x,...
#a = 2,x,...
a = 3,x,...
#a = 4,x,...
a = 5,x,...

需求是这样的, 参数条件为1~5中的一个, 匹配1~5的行, 如果该行第一个字符为#则删除#, 如果不是#则添加一个#号;

例子: 输入参数4 则将#a = 4,x,... 的#号去掉, 文件内容变成:
#a = 1,x,...
#a = 2,x,...
a = 3,x,...
a = 4,x,...
a = 5,x,...

如果再输入参数5,则将a = 5,x,... 补充#号, 文件内容变成:
#a = 1,x,...
#a = 2,x,...
a = 3,x,...
a = 4,x,...
#a = 5,x,...

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
2 [报告]
发表于 2013-12-30 11:54 |只看该作者
回复 1# hello|world


    Perl 的特殊变量 $NR 是当前正在读的文件的行号。知道了行号,匹配一下,做相应的修改即可。

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
3 [报告]
发表于 2013-12-30 11:59 |只看该作者
回复 1# hello|world


    或者用模块 Tie::File,把文件当作一个数组使用。

论坛徽章:
5
丑牛
日期:2014-01-21 08:26:26卯兔
日期:2014-03-11 06:37:43天秤座
日期:2014-03-25 08:52:52寅虎
日期:2014-04-19 11:39:48午马
日期:2014-08-06 03:56:58
4 [报告]
发表于 2013-12-30 12:41 |只看该作者
{:2_168:}小伙伴们, 这个高端大气上档次。
perl script.pl 3
perl script.pl 5
.....
  1. #!/usr/bin/perl -w
  2. $^I = '';
  3. my $file = 'data';  # file name
  4. my ($line) = @ARGV;
  5. @ARGV = $file;

  6. while (<>) {
  7.     /^#/ ? s/^#// : s/^/#/ if $. == $line;
  8.     print;
  9. }
复制代码

论坛徽章:
0
5 [报告]
发表于 2013-12-30 14:09 |只看该作者
非常感谢
perl -i.bak -p -e "/^#/ ? s/^#// : s/^/#/ if /x/i" file

论坛徽章:
32
处女座
日期:2013-11-20 23:41:20双子座
日期:2014-06-11 17:20:43戌狗
日期:2014-06-16 11:05:00处女座
日期:2014-07-22 17:30:47狮子座
日期:2014-07-28 15:38:17金牛座
日期:2014-08-05 16:34:01亥猪
日期:2014-08-18 13:34:25白羊座
日期:2014-09-02 15:03:55金牛座
日期:2014-11-10 10:23:58处女座
日期:2014-12-02 09:17:52程序设计版块每日发帖之星
日期:2015-06-16 22:20:002015亚冠之塔什干火车头
日期:2015-06-20 23:28:22
6 [报告]
发表于 2013-12-30 14:11 |只看该作者
貌似是酱紫:
  1. [root@localhost ~]# cat p
  2. #!/usr/bin/perl
  3. use 5.010;

  4. my @data = <DATA>;

  5. {
  6.         print "Please enter a number (1-5): ";
  7.         chomp(my $n = <STDIN>);
  8.         $_ = $data[--$n];
  9.         /^#/ ? s/^#// : s/^/#/;
  10.         $data[$n] = $_;
  11.         print @data;
  12.         redo;
  13. }

  14. __DATA__
  15. #a = 1,x,...
  16. #a = 2,x,...
  17. a = 3,x,...
  18. #a = 4,x,...
  19. a = 5,x,...
  20. [root@localhost ~]# ./p
  21. Please enter a number (1-5): 4
  22. #a = 1,x,...
  23. #a = 2,x,...
  24. a = 3,x,...
  25. a = 4,x,...
  26. a = 5,x,...
  27. Please enter a number (1-5): 5
  28. #a = 1,x,...
  29. #a = 2,x,...
  30. a = 3,x,...
  31. a = 4,x,...
  32. #a = 5,x,...
  33. Please enter a number (1-5): ^C
  34. [root@localhost ~]#
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP