【问题标题】:Find and replace only at the beginning of a line仅在行首查找和替换
【发布时间】:2013-11-19 19:36:19
【问题描述】:

我是 Perl 的新手(例如,今天下午才开始使用它),因为我必须处理一些需要将其转换为 .sql 的大而繁琐的文本文件。在完成了几个基本的正则表达式查找/替换操作后,我使用了以下行:

s/$/');/g;

我最终得到了 300k+ 行,如下所示:

');INSERT INTO `test` VALUES('aa1b','MediaWiki1Deletecomment','1',5609');

哎呀。所以这只是应该把'); 放在每行的末尾,但显然我误解了,它把它卡在了行的开头和结尾。所以有几个问题:

  1. 我将如何正确地做到这一点?显然我误解了s/$/');/g;
  2. 既然我在每行的开头插入了一个');,我该如何修复这个文件,我如何有选择地搜索每一行并删除行开头而不是结尾的'); ?

这个 Perl/Regex 菜鸟谢谢你!

【问题讨论】:

  • 您的模式对于将'); 附加到每行的末尾是正确的,但/g 开关是不必要的。你用[mysql]标记了这个问题,所以假设你在一些类Unix平台上运行是否安全?
  • 是的,我是。我想我误解了 /g 实际服务的功能。
  • 要修复您的文件,您可以在每一行运行s/^'\);//;
  • 你是如何阅读文本文件的? open 后跟 while (<$fh>) { ... } 或其他不同的东西?您是否更改了 Perl 的输入记录分隔符 $/ 的值?你是怎么写输出的?
  • 我有一个我写的 .pl 文件,它打开并写入一个 .txt 文件。然后我只是有一个 foe 循环,它遍历文本文件的每一行并应用我要执行的任何正则表达式。因此,例如: for (@lines) { s/$/');/g;打印;然后我通过终端运行 .pl 文件。

标签: mysql regex perl replace find


【解决方案1】:

删除这些前导字符的最简单命令是使用. 匹配任何字符并使用量词在每行的开头重复三次,并使用单行:

perl -pe 's/^.{3}//' infile

【讨论】:

  • 那确实有效。不是 100% 确定原因,但你已经解决了我的问题并给了我一些研究的东西。 :) 谢谢!
【解决方案2】:

Perl 有一个通过-i 开关启用的就地编辑工具。在您的情况下使用它,如

$ perl -i.bak -pe "s/$/');/" *.sql

这将使用您的原始代码创建一堆*.sql.bak 备份文件,修改后的内容将在您的*.sql 文件中。

要纠正已经存在的问题,请运行

$ perl -i.bak -pe "s/^');//" *.sql

【讨论】:

  • 感谢这个Greg,我以后一定会用这个方法的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-09
  • 2014-03-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多