Удалить символы latin1 из файла - PullRequest
0 голосов
/ 30 сентября 2019

Мой файл - utf8, но содержит несколько символов latin1, а именно другие иностранные языки. Моя цель - избавиться от этих символов с помощью команды Unix. Ранее, когда я пытался добиться этого, удаляя все символы, не входящие в ASCII, команда ниже также удалила все акцентированные символы. Я хотел сохранить акцентированные символы в той же руке, что и для удаления из файла только неанглийских (мандарин, японский, корейский, тайский, арабский) терминов.

grep --color='auto' -P -n "[\x80-\xFF]" file.txt  -> this command helped me remove non-ASCII chars but it also removes the accented chars(í, æ, Ö etc)...is it possible to get


888|Jobin|Matt|NORMALSQ|YUOZ|IOP|OPO|洁|ID12|doorbell|geo@xyx.comd
1011|ICE|LAND|邵|DUY|DUY|123|EOP|dataset1|geo@xyx.com
53101|炜|GUTTI|RR|Hi|London|UK|WLU|GB|dataset1|陈
สัอ |JOH|LIU|ABC|DUY|DUY|57T2P|EOP|unknown|geo@xyx.com
เมื่รกเริ่ม|JOH|LIU|ABC|DUYសា|DUY|57T2P|EOP|unknown|geo@xyx.com
?|??| RAVI|OLE|Hi|London|UK|NA|GB|unknown| WELSH@WELSH.COM
Rogério|Davies|Hi|USA|US|WLU|US|unknown| USA@WELSH.COM
Balázs| Roque| Hi|USA|US|WLU|US|unknown| USA@WELSH.COM
Johny|Peniç| Hi|USA|US|WLU|US|unknown| USA@WELSH.COM
 Mike|Mane| Hi | USA |US|WLU|US|unknown| USA@WELSH.COM

Вывод:

888|Jobin|Matt|NORMALSQ|YUOZ|IOP|OPO||ID12|doorbell|geo@xyx.comd
1011|ICE|LAND||DUY|DUY|57T2P|EOP|dataset1|geo@xyx.com
53101||GUTTI|RR|Hi|London|UK|WLU|GB|dataset1|
 |JOH|LIU|ABC|DUY|DUY|57T2P|EOP|unknown|geo@xyx.com
 |JOH|LIU|ABC|DUY|DUY|57T2P|EOP|unknown|geo@xyx.com
|| RAVI|OLE|Hi|London|UK|NA|GB|unknown| WELSH@WELSH.COM
Rogério|Davies|Hi|USA|US|WLU|US|unknown| USA@WELSH.COM
Balázs| Roque| Hi|USA|US|WLU|US|unknown| USA@WELSH.COM
Johny|Peniç| Hi|USA|US|WLU|US|unknown| USA@WELSH.COM
Mike|Mane| Hi | USA |US|WLU|US|unknown| USA@WELSH.COM

Ответы [ 3 ]

0 голосов
/ 30 сентября 2019

Вы можете использовать свойства Unicode для определения символов, которые принадлежат латинице и базовой латинице, которые, как вам кажется, нужно сохранить. Perl поддерживает их в регулярных выражениях:

perl -CSD -pe 's/[^\p{Basic Latin}\p{Latin}]//g' file.txt

(но не меняется 123 на 57T2P)

  • -CSD включает декодирование UTF-8 /кодирование ввода и вывода
  • -p читает строку ввода построчно и печатает каждую строку после обработки
  • s/PATTERN/REPLACEMENT/g - глобальная замена, она заменяет все вхождения PATTERN заменой,в этом случае замена пуста
  • [...] вводит класс символов, ^ в начале отрицает его, т. е. мы хотим сопоставить все, что не латиница или базовая латиница.
0 голосов
/ 30 сентября 2019

Вот самое не элегантное решение вашей проблемы:

$ sed -e 's/[^,./@|[:space:]0-9[=a=][=b=][=c=][=d=][=e=][=f=][=g=][=h=][=i=][=j=][=k=][=l=][=m=][=n=][=o=][=p=][=q=][=r=][=s=][=t=][=u=][=v=][=w=][=x=][=y=][=z=][=A=][=B=][=C=][=D=][=E=][=F=][=G=][=H=][=I=][=J=][=K=][=L=][=M=][=N=][=O=][=P=][=Q=][=R=][=S=][=T=][=U=][=V=][=W=][=X=][=Y=][=Z=]]//g' file.txt

К моему большому удивлению, я не смог использовать [:punct:], потому что некоторые символы фактически определены как знаки пунктуации.

0 голосов
/ 30 сентября 2019

Если у вас действительно UTF-8 и вы хотите оставить только расширенные символы ascii (обычно латинские 1), iconv может работать для вас.

iconv -c -f UTF8 -t LATIN1 input_file > output_file

-c Молча отбрасывать символы, которые не могут быть преобразованы, вместо завершения при обнаружении таких символов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...