Ruby one liner只替换匹配的行,丢弃其他行

时间:2016-11-27 10:11:27

标签: ruby regex

寻找红宝石单衬垫替代品,只有当线条与正则表达式匹配时才打印出替换:

echo -e "Line 1\nLine 2\nLine 3" | perl -ne "print if s/Line 2/Line 2 replaced, others discarded/g"

输入:

Line 1
Line 2
Line 3

输出:

Line 2 replaced, others discarded

1 个答案:

答案 0 :(得分:1)

据我所知,ruby中没有等同于-ne的简写。所以它会更长一点:

echo -e "Line 1\nLine 2\nLine 3" | ruby -e 'puts $<.read.lines.map {|l| l =~ /Line 2/ ? l.gsub(/Line 2/, "Line 2 replaced, others discarded") : nil }.compact'

其中:

  • $<ARGFdocs)是Stream for file参数或STDIO
  • $<.read会将其全部读为字符串
  • $<.read.lines由换行符分割,返回数组
  • map {|l| ... }会将块中的表达式结果收集到新数组
  • l =~ /Line 2/检查字符串是否与Regex匹配
  • l.gsub(/Line 2/, "Line 2 replaced")会将所有“第2行”替换为“第2行已更换”
  • .compact将从数组中删除nil值(返回没有nil的新数组)
  • puts []将在新行
  • 上打印数组的每个元素

可能ruby不是这项任务的最佳选择,我会选择sed或在文本编辑器中执行。大多数文本编辑器现在可以通过正则表达式查找和替换