Bash / Linux在.txt文件中查找非ASCII字符并将其替换为ASCII字符

时间:2017-06-20 22:25:24

标签: r regex bash ascii non-ascii-characters

我有一份从海洋仪器上卸下的文件清单。出于某种原因,偶尔会在ASCII字符应插入的位置插入非ASCII字符。我发现了严重的E(È),在经度记录中应该有一个W表示西半球。

这是数据的样子:

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尝试读取这些文件时返回的错误的解决方法(“位置中的多字节字符串...”)对我的目的同样有效。任何帮助非常感谢。

2 个答案:

答案 0 :(得分:2)

我认为问题是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>

答案 1 :(得分:0)

您可以使用sedÈ替换为W

sed 's/È/W/g' 170510_ocean_Copepod.txt