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

标签 r regex bash ascii non-ascii-characters

我有一份从海洋学仪器卸载的文件列表。由于某种原因,偶尔会在应该是 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 在尝试读取这些文件时返回的错误(“位置中的多字节字符串...”)的解决方法对我的目的同样有效。非常感谢任何帮助。

最佳答案

我认为问题在于 utf-8 中的 È 是由 \xc3\x88 组成的多字节字符sed 似乎无法出于任何原因处理该问题。正如@Jack 所建议的那样,tr 可能是更好的工作工具(在没有 pcregrep 的 Windows 的 bash 中测试):

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>

关于r - Bash/Linux 在 .txt 文件中查找非 ASCII 字符并将其替换为 ASCII 字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44663963/

相关文章:

r - 将列表列转换为字符串列

在 jupyter 中使用 R 实时打印到控制台

javascript - 正则表达式解析问题ecmascript

bash - 1 : command not found

linux - while 循环不遍历文件

Rvest:获取节点文本而不是其子文本

r - 水平分解无法转换为 ggplot barplot 变量顺序

javascript - 匹配打开和关闭标签

r - 关键字在 R 中字符串的上下文中重复多次

linux - 如何将一个文件中的所有单词提供给 'tr' 以便在另一个文件中搜索和删除文本?