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