我需要将文件中的 \x0d\x0a
替换为 \x2c\x0d\x0a
以下内容不会执行任何操作:
awk '{if NR> 1 {gsub(/\x0D\x0A/,"\x2C\x0D\x0A"); print}}' test.csv > testfixed.csv
$ xxd test.csv
00000e0: 350d 0a45 4941 2d39 3330 2c44 6169 6c79 5..EIA-930,Daily
00000f0: 2c4e 5949 532c 2c55 5443 302c 3030 3132 ,NYIS,,UTC0,0012
最佳答案
您正在尝试替换十六进制字符串 \x0D\x0A
,它只不过是 CRLF
或 \r\n
.
自 awk默认情况下,在 LF
)上分割其记录,实际上您永远不必尝试匹配您的 \n
(或 \x0a
)。因此,您需要做的就是将 \r
替换为 ,\r
(0x2c
是 ,
的十六进制值)。所以这应该可以解决问题:
awk '(NR>1){sub("\r$",",\r"); print}' file
那么为什么你的脚本失败了?
如前所述,awk适用于记录,默认记录分隔符是 \n
并具有十六进制值 \x0a
)永远不是记录 $0
的一部分。此外,打印语句会自动在记录后添加其记录输出分隔符 ORS
。默认情况下,这又是
awk 'NR > 1 {sub(/\x0D$/,"\x2C\x0D"); print}' test.csv > testfixed.csv
那么是否可以通过其十六进制值来替换?
是的,显然是这样!
echo -n "Hello World" | awk 'sub(/\x57\x6f\x72\x6c\x64/,"\x43\x6f\x77")'
但是我如何更改
您可以重新定义输出记录分隔符ORS
:
awk -v ORS="whatever" '1'
此外,使用 GNU awk,您可以按照 glenn jackman's solution 进行操作。 .
非常相关:Why does my tool output overwrite itself and how do I fix it?
关于awk - 需要将文件中的\x0d\x0a替换为\x2c\x0d\x0a,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52953524/