Я хочу удалить все символы, отличные от ASCII, из файла на месте.
Я нашел одно решение с tr, но я думаю, мне нужно записать этот файл после модификации.
Мне нужно сделать это на месте с относительно хорошей производительностью.
Любые предложения?
Я хочу удалить все символы, отличные от ASCII, из файла на месте.
Я нашел одно решение с tr, но я думаю, мне нужно записать этот файл после модификации.
Мне нужно сделать это на месте с относительно хорошей производительностью.
Любые предложения?
# -i (inplace)
sed -i 's/[\d128-\d255]//g' FILENAME
А perl oneliner будет делать: perl -i.bak -pe 's/[^[:ascii:]]//g' <your file>
-i
говорит, что файл будет редактироваться на месте, а резервная копия будет сохранена с расширением .bak
.
Я перепробовал все решения и ничего не получалось. Следующее, однако, делает:
tr -cd '\11\12\15\40-\176'
Который я нашел здесь:
https://alvinalexander.com/blog/post/linux-unix/how-remove-non-printable-ascii-characters-file-unix
Моя проблема нуждалась в этом в ряде программ, а не в файле, поэтому изменяйте их по мере необходимости.
sed -i 's/[^[:print:]]//' FILENAME
Кроме того, это действует как dos2unix
Я нашел следующее решение для работы:
perl -i.bk -pe 's/[^[:ascii:]]//g;' filename
Попробуйте tr
вместо sed
tr -cd '[:print:]' < file.txt
Я использую очень минимальную систему busybox, в которой нет поддержки диапазонов в классах символов tr
или POSIX, поэтому я должен сделать это crappy старомодным способом. Здесь решение с sed
, удалив ВСЕ НЕИСПРАВЛЯЕМЫЕ символы, отличные от ASCII, из файла:
sed -i 's/[^a-zA-Z 0-9`[email protected]#$%^&*()_+\[\]\\{}|;'\'':",.\/<>?]//g' FILE
Это сработало для меня:
sed -i 's/[^[:print:]]//g'
В качестве альтернативы 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'
awk '{ sub("[^a-zA-Z0-9\"[email protected]#$%^&*|_\[](){}", ""); print }' MYinputfile.txt > pipe_out_to_CONVERTED_FILE.txt
# -i (inplace)
LANG=C sed -i -E "s|[\d128-\d255]||g" /path/to/file(s)
Роль детали LANG=C
состоит в том, чтобы избежать ошибки Invalid collation character
.
На основании ответа Ивана и комментария Патрика.
Я ценю советы, которые я нашел на этом сайте.
Но, на моей Windows 10, мне пришлось использовать двойные кавычки, чтобы это работало...
sed -i "s/[\d128-\d255]//g" FILENAME
Заметил эти вещи...
Для FILENAME необходимо указать весь путь\имя
Это не сработало - %TEMP%\"FILENAME"
Это сделало - %TEMP%\FILENAME"
sed оставляет за собой временные файлы в текущем каталоге с именем sed *