代码之家  ›  专栏  ›  技术社区  ›  puravidaso

gsub的意外结果与行尾匹配:cat/etc/hosts | ruby-ne'print$|。gsub(/$/,%q(xxx))'

  •  0
  • puravidaso  · 技术社区  · 3 年前

    以下是我的命令行:

    $ cat /etc/hosts | ruby -ne 'print $_.gsub(/$/, %q( xxx ))'
    

    它返回:

    # To allow the same kube context to work on the host and the container: xxx 
     xxx 127.0.0.1 localhost kubernetes.docker.internal xxx 
     xxx # End of section xxx 
    

    我没想到xxx会出现在这一行的开头(第一行没有)。我需要 gsub 因为我需要在实际代码中匹配其他内容和行尾: (something else|$) ,这只是一个显示预期行为的简化案例。

    总结一下:

    • 我如何只匹配行的末尾?
    • 为什么它与从第二行开始的行的开头相匹配?

    谢谢

    0 回复  |  直到 3 年前
        1
  •  1
  •   Chris Heald    3 年前

    $ 记下这行末尾的位置 之后 这个 \n 在队伍的尽头!“替换”实质上是在 \n ,这使它出现在下一行。然而,替换$是没有意义的,因为总有一个$在排队。相反,您希望与模式匹配 /\r?\n/ 相反

    \r是chr 13“回车”的转义码,\n是chr 10换行符的转义码。类Unix系统将只使用\r\n来写行,而Windows系统将使用\r\n来终止行,因此考虑这两个字符是理想的。

    由于匹配的模式已被替换,但您可能仍希望在输出中保留换行符,因此我们将匹配的模式包括在输出中。

    cat /etc/hosts | ruby -ne 'print $_.gsub(/\r?\n/, "xxx\\0")'
    

    或者,你可以替换换行符并使用 puts 而不是 print 要在该行回显到stdout时将其添加回去,请执行以下操作:

    cat /etc/hosts | ruby -ne 'puts $_.gsub(/\r?\n/, "xxx")'