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")'
这是我的命令行:
$ 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")'