awk - 带有 CRLF 行结尾的 Linux 和 mingw64 上的不同 awk 结果
问题描述
在 Linux 上:
echo -n $'boo\r\nboo\r\n' | awk $'BEGIN { RS="\\n" } {gsub("boo","foo"); print}' | cat -v
返回预期的
foo^M
foo^M
但是,在 mingw64(Windows 的 git bash)上,相同的命令返回:
foo
foo
没有回车。
我尝试明确设置记录分隔符,因为两个平台之间的默认值可能不同,但是 mingw64 上的 awk 仍在咀嚼回车。我怎样才能让 awk 在 mingw64 上的 Linux 上做同样的事情?请注意,awk 版本略有不同(Linux 上的 GNU Awk 4.0.2 和 mingw64 上的 GNU Awk 4.2.1),但除非存在某种错误,否则我不认为这很重要。
请注意,由于在 mingw64 上,awk 中特别发生了一些事情:
echo -n $'boo\r\nboo\r\n' | cat -v
返回预期:
boo^M
boo^M
解决方案
这是由 C 库完成的,要阻止它发生,您应该将 awk BINMODE 变量设置为 3
我将您的代码更改为:
echo -n $'boo\r\nboo\r\n' | awk -v BINMODE=3 $'BEGIN { RS="\\n" } {gsub("boo","foo"); print}' | cat -v
并在 Unix、Linux、MacOS 和 Windows 上进行了尝试,都产生了这个输出:
foo^M
foo^M
-v BINMODE=3
您正在寻找的也是如此。
请注意,只有-v BINMODE=3
此开关和在代码方式工作之前。
通常我们可以通过-v
switch、in BEGIN
block 或在文件之前的 code 之后将变量传递给 awk,
但在这种情况下,我尝试了这三种方式,只管用-v BINMODE=3
。
猜猜这与awk
's 的编译过程有关。
示例(在cygwin
Windows 下):
$ echo -n $'boo\r\nboo\r\n' | awk -v BINMODE=3 '1' | cat -v
boo^M
boo^M
$ echo -n $'boo\r\nboo\r\n' | awk 'BEGIN{BINMODE=3}1' | cat -v
boo
boo
$ echo -n $'boo\r\nboo\r\n' | awk '1' BINMODE=3 | cat -v
boo
boo
在其他提到的平台下,它们都产生:
boo^M
boo^M
推荐阅读
- docker - GitHub Packages Docker - 提取图像配置时出错:未知 blob
- java - 适配器模式应用
- sql - SQL 检查订单日期的更改频率
- sql - 如何在Oracle中知道带有照片的表的大小
- ios - 更改控制中心的可访问性标签(远程命令中心)
- ios - 如何使用 Swift 5 从 iOS13 的后台应用程序中获取活动应用程序的名称?
- reactjs - ReactJS - 无需更改多个组件之间的 URL 切换
- ruby-on-rails - rails 6 app 测试为绿色,但在生产中出现奇怪的效果:LoadError(无法加载此类文件——rb-readline)
- api - 在 asp.net core 3.0 中配置 NServiceBus 版本 7.1.x 的最佳方式
- java - Android Studio 中的多个“重复类”错误