Подтвердить что ты не робот

Удаление символов, отличных от ASCII, из CSV

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

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

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

Любые предложения?

4b9b3361

Ответ 1

# -i (inplace)

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

Ответ 2

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

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

Ответ 3

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

tr -cd '\11\12\15\40-\176'

Который я нашел здесь:

https://alvinalexander.com/blog/post/linux-unix/how-remove-non-printable-ascii-characters-file-unix

Моя проблема нуждалась в этом в ряде программ, а не в файле, поэтому изменяйте их по мере необходимости.

Ответ 4

sed -i 's/[^[:print:]]//' FILENAME

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

Ответ 5

Я нашел следующее решение для работы:

perl -i.bk -pe 's/[^[:ascii:]]//g;' filename

Ответ 6

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

tr -cd '[:print:]' < file.txt

Ответ 7

Я использую очень минимальную систему busybox, в которой нет поддержки диапазонов в классах символов tr или POSIX, поэтому я должен сделать это crappy старомодным способом. Здесь решение с sed, удалив ВСЕ НЕИСПРАВЛЯЕМЫЕ символы, отличные от ASCII, из файла:

sed -i 's/[^a-zA-Z 0-9`[email protected]#$%^&*()_+\[\]\\{}|;'\'':",.\/<>?]//g' FILE

Ответ 8

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

sed -i 's/[^[:print:]]//g'

Ответ 9

В качестве альтернативы 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'

Ответ 10

awk '{ sub("[^a-zA-Z0-9\"[email protected]#$%^&*|_\[](){}", ""); print }' MYinputfile.txt > pipe_out_to_CONVERTED_FILE.txt

Ответ 11

# -i (inplace)

LANG=C sed -i -E "s|[\d128-\d255]||g" /path/to/file(s)

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

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

Ответ 12

Я ценю советы, которые я нашел на этом сайте.

Но, на моей Windows 10, мне пришлось использовать двойные кавычки, чтобы это работало...

sed -i "s/[\d128-\d255]//g" FILENAME

Заметил эти вещи...

  • Для FILENAME необходимо указать весь путь\имя Это не сработало - %TEMP%\"FILENAME" Это сделало - %TEMP%\FILENAME"

  • sed оставляет за собой временные файлы в текущем каталоге с именем sed *