Удалить не-ASCII символы из CSV - PullRequest
51 голосов
/ 26 июля 2010

Я хочу удалить все не-ASCII символы из файла на месте.

Я нашел одно решение с помощью tr, но, думаю, мне нужно записать этот файл после модификации.

Мне нужно сделать это на месте с относительно хорошей производительностью.

Есть предложения?

Ответы [ 11 ]

67 голосов
/ 26 июля 2010

Perl oneliner будет делать: perl -i.bak -pe 's/[^[:ascii:]]//g' <your file>

-i говорит, что файл будет редактироваться на месте, а резервная копия будет сохранена с расширением .bak.

40 голосов
/ 26 июля 2010
# -i (inplace)

sed -i 's/[\d128-\d255]//g' FILENAME
14 голосов
/ 21 декабря 2017

Я перепробовал все решения и ничего не получалось.Следующее, однако:файл, поэтому измените по мере необходимости.

13 голосов
/ 17 января 2012
sed -i 's/[^[:print:]]//' FILENAME

Кроме того, это действует как dos2unix

8 голосов
/ 28 февраля 2018

Попробуйте tr вместо sed

tr -cd '[:print:]' < file.txt
4 голосов
/ 01 мая 2017

Это сработало для меня:

sed -i 's/[^[:print:]]//g'
4 голосов
/ 28 октября 2014

Я использую очень минимальную систему busybox, в которой нет поддержки диапазонов в tr или классах символов POSIX, поэтому я должен сделать это дрянным старомодным способом.Вот решение с sed, убирающее из файла ВСЕ непечатаемые символы не ASCII:

sed -i 's/[^a-zA-Z 0-9`~!@#$%^&*()_+\[\]\\{}|;'\'':",.\/<>?]//g' FILE
3 голосов
/ 28 июля 2010

В качестве альтернативы sed или perl вы можете использовать классы символов ed (1) и POSIX.

Примечание: ed (1) считывает весь файл в память, чтобы редактировать его на месте, поэтомудля действительно больших файлов вы должны использовать sed -i ..., perl -i ...

# see:
# - http://wiki.bash-hackers.org/doku.php?id=howto:edit-ed
# - http://en.wikipedia.org/wiki/Regular_expression#POSIX_character_classes

# test
echo $'aaa \177 bbb \200 \214 ccc \254 ddd\r\n' > testfile
ed -s testfile <<< $',l' 
ed -s testfile <<< $'H\ng/[^[:graph:][:space:][:cntrl:]]/s///g\nwq'
ed -s testfile <<< $',l'
2 голосов
/ 19 августа 2014
awk '{ sub("[^a-zA-Z0-9\"!@#$%^&*|_\[](){}", ""); print }' MYinputfile.txt > pipe_out_to_CONVERTED_FILE.txt
1 голос
/ 02 мая 2018
# -i (inplace)

LANG=C sed -i 's/[\d128-\d255]//g' FILENAME

Роль детали LANG=C состоит в том, чтобы избежать ошибки Invalid collation character.

На основании ответа Ивана и комментария Патрика.

...