awk - 需要将文件中的\x0d\x0a替换为\x2c\x0d\x0a

标签 awk hex

我需要将文件中的 \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 .

默认情况下,在 字符(即 LF)上分割其记录,实际上您永远不必尝试匹配您的 字符 \n (或 \x0a)。因此,您需要做的就是将 \r 替换为 ,\r (0x2c, 的十六进制值)。所以这应该可以解决问题:

awk '(NR>1){sub("\r$",",\r"); print}' file

那么为什么你的脚本失败了?

如前所述,适用于记录,默认记录分隔符是 字符。这意味着 字符(也写为 \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/

相关文章:

parsing - lua 解析超过一个字节后

postgresql - 将文本表示中的十六进制转换为十进制数

BASH:同时并排显示两个文件

bash - 如何定义单词的参数?

linux - 如何打印 column1 中的所有行以及其他列中的某些行

bash - 如何使用 bash 脚本拆分包含多条记录的行

javascript - php bin2hex() 在 javascript 中解码

c++ - C++ cout不能以正确的格式显示十六进制字节

c++ - 读取文件十六进制数据并存储到 C++ 中的字符串二维数组中

bash - 使用 awk 计算接口(interface)类型