即时修改行(例如,修复 Windows 行结尾)

如果文件可能包含 Windows 或类 Unix 行结尾(或者甚至是两者的混合),那么预期的文本替换可能无法按预期工作。

样品:

$ echo -e 'Entry 1\nEntry 2.1\tEntry 2.2\r\nEntry 3\r\n\r\n' \
> | awk -F'\t' '$1 != "" { print $1 }' \
> | hexdump -c
0000000   E   n   t   r   y       1  \n   E   n   t   r   y       2   .
0000010   1  \n   E   n   t   r   y       3  \r  \n  \r  \n            
000001d

这可以通过在 awk 脚本开头插入的附加规则轻松修复:

/\r$/ { $0 = substr($0, 1, length($0) - 1) }

由于操作不以 next 结束,因此以前的规则将被应用。

样本(修复了行尾):

$ echo -e 'Entry 1\nEntry 2.1\tEntry 2.2\r\nEntry 3\r\n\r\n' \
> | awk -F'\t' '/\r$/ { $0 = substr($0, 1, length($0) - 1) } $1 != "" { print $1 }' \
> | hexdump -c
0000000   E   n   t   r   y       1  \n   E   n   t   r   y       2   .
0000010   1  \n   E   n   t   r   y       3  \n                        
000001a