【问题标题】:How can I record changes made during in-place editing in Perl?如何记录在 Perl 中就地编辑期间所做的更改?
【发布时间】:2010-10-11 08:25:11
【问题描述】:

我编写了一个简单的 ksh 脚本,它调用 Perl 程序来查找和替换文件。 传入的 arg 是主目录:

 perl -pi -e 's/find/replace/g' $1/*.html

效果很好。但是,我想将所有更改输出到日志文件。我已经尝试过管道和重定向,但无法让它工作。有什么想法吗?

谢谢, 格伦

【问题讨论】:

  • 你能澄清你所说的“变化”是什么意思吗?日志文件中应该出现什么?
  • 我正在考虑文件名以及包含替换之前的查找字符串的整行。除非你有更好的建议。也许只需更改行号的文件名就足够了。
  • 两个答案的工作方式相似。我选择了第一个回答的那个。谢谢你们的帮助。

标签: perl file replace find logging


【解决方案1】:

像这样将所有更改发送到 STDERR:

perl -pi -e '$old = $_; s/find/replace/g and warn "${ARGV}[$.]: $old $_"; close ARGV if eof' $1/*.html

更新:固定 $。在多个文件上。

【讨论】:

  • 谢谢,我今晚试试。只是想知道你是否可以解释变量? denkfaul 的解决方案将输出重定向到 logfile.txt。在您的解决方案中,我不确定哪个变量指向日志文件。我会向你提出与使用 Perl 的问题一样的问题...
  • "warn" 输出到 STDERR,因此您可以将其重定向到日志文件,就像在 denkfaul 的答案中一样。 “$ARGV”是当前文件名,“ARGV”是文件句柄,$_是当前行,$.是当前行号。参见“perldoc perlvar”和“perldoc -f eof”
  • 优秀。谢谢。您是否有机会看到我在第二部分中提到的问题:'如果我从 ksh 脚本切换到本机 Perl 脚本,解决方案会更容易还是更合乎逻辑'?
【解决方案2】:

您可以打印到 STDERR 并将 STDERR 输出重定向到如下文件:

perl -pi -e 'chomp($prev=$_);s/find/replace/g and print STDERR "$ARGV - $.: $prev -> $_"; close ARGV if eof' $1/*.html 2> logfile.txt

编辑:添加文件名,当使用多个输入文件时固定行号显示

【讨论】:

  • 老实说,我想到了 eof 的事情,回到这里进行编辑,并注意到您已经更改了 :-)
  • 不用担心 :) 我最初会为你添加 cmets,而不是创建类似的答案,但我还没有代表 :|
  • 谢谢,今晚我试试。如果我从 ksh 脚本切换到本机 Perl 脚本,解决方案会更容易或更合乎逻辑吗?
  • @glenwark:对于这么简单的事情,你用哪种方式来做并不重要。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-02-07
相关资源
最近更新 更多