Bash/Linux 在 .txt 文件中查找非 ASCII 字符并将其替换为 ASCII 字符
Bash/Linux Find non-ASCII character in a .txt file and replace it with an ASCII character
我有一份从海洋学仪器卸载的文件列表。由于某种原因,偶尔会在应该是 ASCII 字符的地方插入一个非 ASCII 字符。我发现经度记录中应该有一个W表示西半球的坟墓-E(È)。
数据如下:
CUMSECS Date UTC Time UTC Date Local Time local Z (m) Target Z Z Bot Temp PAR Salin Ang VelX Ang VelY Ang VelZ Pump + Pump - Gctr Fix secs Date UTC Time UTC Date Local Time Local Lat LatD Latm Lon LonD Lonm DOP Temp PAR Salin Batt V CMD secs Date Local Time Local No. Cmds
526068034 09/01/16 18:00:34 09/01/16 11:00:34 3.75 2.69
3.75 0.29 0.000000 0.00 -12 -70 -50 0 5 10
526068039 09/01/16 18:00:39 09/01/16 11:00:39 3.75 2.69
3.75 0.29 0.000000 0.00 -12 -70 -50 0 5 10
526068044 09/01/16 18:00:44 09/01/16 11:00:44 3.74 2.69
3.75 0.29 0.000000 0.00 -12 -70 -50 0 5 10
526068049 09/01/16 18:00:49 09/01/16 11:00:49 3.73 2.69
3.75 0.29 0.000000 0.00 -30732 13588 31909 60399 7538 -82
543622771 03/23/17 22:19:31 03/23/17 15:19:31 38.31877 38
19.1262 N 123.07136 123 4.2812 È 23.6 115.06 0.0000 96.00
121.718
547764151 05/10/17 20:42:31 05/10/17 13:42:31 0.03 16.00
127.00 13.68 1074.904320 33.56 -4908 -3976 261 1 0 0
547764152 05/10/17 20:42:32 05/10/17 13:42:32 0.00 16.00
127.00 13.68 1074.904320 33.56 -4908 -3976 261 1 0 0
我可以使用下面的 Bash 行找到非 ASCII 字符
pcregrep -n '[^\x00-\x7F]' 170510_ocean_Copepod.txt
我想遍历一系列文件,找到这些字符,然后用 'W' 替换它们,这样我就可以随后将它们读入 R 并进行整体处理。或者,R 在尝试读取这些文件 ("multibyte string in location...") 时返回的错误的变通方法对我的目的同样有效。非常感谢任何帮助。
我觉得问题是utf-8中的È
是一个多字节字符,由\xc3
和\x88
组成,sed
好像不能处理不管出于什么原因。正如@Jack 所建议的那样,tr
可能是更好的工作工具(在 bash 中针对没有 pcregrep 的 windows 进行了测试):
user@PC:~$ grep -P '[^\x00-\x7f]' | tr 'È' 'W'
19.1262 N 123.07136 123 4.2812 WW 23.6 115.06 0.0000 96.00
请注意,它确实将两个字节分别转换为 W
。
另一种方法是使用 iconv
转换整个文件。 iso-8859-15 (latin-9) 是单字节字符编码的一个例子。使用 iconv
转换文件的命令是:
iconv -f utf-8 -t iso-8859-15 -o <converted-file> <input-file>
您可以使用 sed
将 È
替换为 W
:
sed 's/È/W/g' 170510_ocean_Copepod.txt
我有一份从海洋学仪器卸载的文件列表。由于某种原因,偶尔会在应该是 ASCII 字符的地方插入一个非 ASCII 字符。我发现经度记录中应该有一个W表示西半球的坟墓-E(È)。
数据如下:
CUMSECS Date UTC Time UTC Date Local Time local Z (m) Target Z Z Bot Temp PAR Salin Ang VelX Ang VelY Ang VelZ Pump + Pump - Gctr Fix secs Date UTC Time UTC Date Local Time Local Lat LatD Latm Lon LonD Lonm DOP Temp PAR Salin Batt V CMD secs Date Local Time Local No. Cmds
526068034 09/01/16 18:00:34 09/01/16 11:00:34 3.75 2.69
3.75 0.29 0.000000 0.00 -12 -70 -50 0 5 10
526068039 09/01/16 18:00:39 09/01/16 11:00:39 3.75 2.69
3.75 0.29 0.000000 0.00 -12 -70 -50 0 5 10
526068044 09/01/16 18:00:44 09/01/16 11:00:44 3.74 2.69
3.75 0.29 0.000000 0.00 -12 -70 -50 0 5 10
526068049 09/01/16 18:00:49 09/01/16 11:00:49 3.73 2.69
3.75 0.29 0.000000 0.00 -30732 13588 31909 60399 7538 -82
543622771 03/23/17 22:19:31 03/23/17 15:19:31 38.31877 38
19.1262 N 123.07136 123 4.2812 È 23.6 115.06 0.0000 96.00
121.718
547764151 05/10/17 20:42:31 05/10/17 13:42:31 0.03 16.00
127.00 13.68 1074.904320 33.56 -4908 -3976 261 1 0 0
547764152 05/10/17 20:42:32 05/10/17 13:42:32 0.00 16.00
127.00 13.68 1074.904320 33.56 -4908 -3976 261 1 0 0
我可以使用下面的 Bash 行找到非 ASCII 字符
pcregrep -n '[^\x00-\x7F]' 170510_ocean_Copepod.txt
我想遍历一系列文件,找到这些字符,然后用 'W' 替换它们,这样我就可以随后将它们读入 R 并进行整体处理。或者,R 在尝试读取这些文件 ("multibyte string in location...") 时返回的错误的变通方法对我的目的同样有效。非常感谢任何帮助。
我觉得问题是utf-8中的È
是一个多字节字符,由\xc3
和\x88
组成,sed
好像不能处理不管出于什么原因。正如@Jack 所建议的那样,tr
可能是更好的工作工具(在 bash 中针对没有 pcregrep 的 windows 进行了测试):
user@PC:~$ grep -P '[^\x00-\x7f]' | tr 'È' 'W'
19.1262 N 123.07136 123 4.2812 WW 23.6 115.06 0.0000 96.00
请注意,它确实将两个字节分别转换为 W
。
另一种方法是使用 iconv
转换整个文件。 iso-8859-15 (latin-9) 是单字节字符编码的一个例子。使用 iconv
转换文件的命令是:
iconv -f utf-8 -t iso-8859-15 -o <converted-file> <input-file>
您可以使用 sed
将 È
替换为 W
:
sed 's/È/W/g' 170510_ocean_Copepod.txt