【问题标题】:Excluding lines that contain a pattern before replacing in Perl在 Perl 中替换之前排除包含模式的行
【发布时间】:2014-03-06 15:51:21
【问题描述】:

我有以下代码来替换一组文件中的版本字符串

ack --ignore-file=is:HISTORY.md -l --print0 '1\.1\.1' | xargs -0 perl -pi -e 's/1\.1\.1/1\.1\.2/g' 

现在,我意识到 doxygen 注释中有一些行也有这样的版本字符串。

/**
 * Generate Tag id from Tag name
 *
 * @since 1.1.1
 * @static
 * @access public
 *
 */

如何修改上面的 sn-p 以排除包含@since 的行?

【问题讨论】:

  • 我确实希望\2 是一个错字,否则它是您代码中的无声错误。 \2 是对您未使用的捕获组的反向引用,因此 \2 被插入到空字符串中,并且由于您没有使用警告,因此您不会收到任何警告。
  • @TLP 是的,是一个错字。我刚刚修好了。谢谢。
  • 包含1.1.1的行是版本行吗?
  • @sin 是的。在这种情况下,1.1.1 是当前版本号

标签: regex perl ack


【解决方案1】:

要排除带有@since 的行,你可以试试这个而不是你当前的 perl 替换代码:

!/\@since/ && s/1\.1\.1/1.1.2/g

甚至

/\@since/ || s/1\.1\.1/1.1.2/g

【讨论】:

  • 感谢这项工作。顺便说一句,我们不必在替换字符串中转义 . 吗?
  • @Sudar - 不——它们不匹配。
  • @Sudar,正则表达式模式元字符在替换中无效,因此不需要转义。
猜你喜欢
  • 2013-08-22
  • 1970-01-01
  • 2016-04-05
  • 2016-06-17
  • 2022-01-11
  • 2012-03-15
  • 1970-01-01
  • 2014-10-24
  • 2019-06-01
相关资源
最近更新 更多