即時修改行(例如,修復 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