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

Unexpect result with gsub to match end of line: cat /etc/hosts | ruby -ne 'print $_.gsub(/$/, %q( xxx ))'

这是我的命令行:

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

它returns:

# 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|$),这只是显示预期行为的简化案例。

总结一下:

谢谢。

$ 注意行尾的位置,在行尾的 之后 ! “替换”它实际上会在 \n 之后添加内容,这会使其显示在下一行。但是,替换 $ 没有意义,因为该行中总会有一个 $。相反,您想匹配模式 /\r?\n/

\r 是字符 13(“回车 return”)的转义码,\n 是字符 10(换行符)的转义码。 Unix-like 系统将仅使用 \n 写入行,而 Windows 系统将使用 \r\n 终止行,因此考虑到这两个字符是理想的。

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

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

或者,您可以只替换换行符并使用 puts 而不是 print 在该行回显到标准输出时将其添加回去:

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