Удалите неизвестный unicode символ из текстовых файлов - sed, другие методы удара/оболочки

Вы можете фон задача путем добавления a & после него.

Например, tail -f /var/log/messages & будет фон задача сразу.

Поскольку всегда Вы видите что задачи Вы фон с jobs команда.

Это, конечно, предполагает, что Вы еще не выполнили команду.

9
21.02.2014, 10:42
2 ответа

Вы должны посмотреть, используя [11678]hexdump -C[11679] и найти байты вокруг него. Предположим, что UTF-8, то, что [11680]vi[11681] показывает как [11682]<91>[11683] (десятичная цифра 145, в тексте точка юникода не имеет смысла) будет два байта, 0xc2 и 0x91.

Это подразумевает, что ваши замены вообще не сработали, но если бы вы просто заменили 0x91 на 0x27, вы бы сделали UTF-8 недействительным (второй байт последовательности из двух байтов всегда имеет старший бит, т.е. >= 0x80). Это может усложнить ваш анализ, хотя [11684]vi[11685] должен показать это как [11686]?'[11687].

Тем не менее, я протестировал это и это работает:

Если [11688]$ARGV[0][11689] существует при ссылке на [11690]<>[11691], perl вытаскивает это из стека аргументов и использует как путь к файлу для ввода (я нахожу, что короткие скрипты проще подправить и работать с ними, чем с одним Liners, BTW). Это накапливается в памяти (прекрасно, если файлы не массивные), в то время как [11692]perl -i[11693] переименовывает исходный файл, чтобы избежать редактирования на месте условий гонки (см. [11694]perldoc perlrun[11695]).

Таким образом, вы можете использовать:

3
27.01.2020, 20:07

Если это действительно символ U+0091 (0xc2 0x91 в кодировке UTF-8), а не байт 0x91, то:

преобразовывает его в [11703]'[11704].

В GNU [11705]sed[11706]:

Edit:

Однако в вашем случае файл не находится в кодировке UTF-8. Символы UTF-8 - это один байт, только для символов ASCII (для значений от 0 до 0x7F). Остальные символы представлены двумя или более байтами, значение которых больше [11709]0x7F[11710]. Таким образом, байт [11711]0x91[11712], не имеющий вокруг байта больше 0x7F, не может быть найден в файле utf-8.

Скорее всего, ваш файл находится в однобайтовом наборе символов, Скорее всего, какой-нибудь Microsoft, например [11713]windows-1252[11714].

В windows-1252, 0x91 - левый символ одиночной кавычки. Юникодный эквивалент - U+2018, который в UTF-8 записан [11715]0xe2 0x80 0x98[11716].

Если вы хотите преобразовать ваш файл в UTF-8, то лучше всего использовать для этого специальную утилиту. Например:

Или:

Или если вы хотите сделать это для каждого имени файла [11717]. txt[11718]:

3
27.01.2020, 20:07

Теги

Похожие вопросы