Как я могу вынудить sed продолжить анализировать, когда он поражает “недопустимый” символ?

Если у Вас есть ряд файлов, для которых Вам нужна низкая задержка, можно установить объем RAID-1, который зеркально отражает содержание SSD на жестком диске. Объявите компонент жесткого диска как “запись главным образом”, так, чтобы SSD был одобрен при чтении. Например, если sda Ваш SSD и sdb Ваш жесткий диск, создайте раздел sda1 это покрывает целый диск, создайте раздел sdb1 из того же размера, и создают объем RAID с

mdadm --create -l 1 -n 2 /dev/md0 /dev/sda1 --write-mostly /dev/sdb1
-2
26.11.2013, 22:37
2 ответа

Как лютик золотистый, уже прокомментированный выше, UTF-8 является многобайтовым кодированием переменной ширины. Каждый символ мог бы состоять максимум из четырех байтов. После недопустимого байта можно в лучшем случае надеяться, что следующий байт мог бы запустить новый символ.

sed попытки соответствовать символам не байты. Поскольку недопустимый байт не является никаким символом и . только символы соответствий, которым это не будет соответствовать и Ваш результат, абсолютно правильны.

Необходимо узнать, какое кодирование используется для того файла. ( file команда могла бы помочь Вам с этим.) Установка переменной среды LANG к правильному значению должен быть достаточно для sed для работы пути, Вы предназначили это к. В Вашем случае, вероятно, LANG=C должен быть достаточно.

3
28.01.2020, 05:15

Установите Ваш LANG переменная среды к некоторой кодировке UTF-8 представляет в виде строки как LANG='en_US.UTF-8'. Здесь, на Mac OS X 10.6.8, это LANG='C' это вызывает GNU sed 4.2.1, чтобы прекратить анализировать, как описано в вопросе. GNU sed 4.2.2, с другой стороны, просто хорошо работает.

Другая модификация, которая работает на меня (на Mac OS X 10.6.8) должна заменить regex часть :.* с: :\([^[:print:]]\|[[:print:]]\)* (Класс символов POSIX).

echo $'rar:///home/andy/audio_compressed/world/ru/Lika Star - Ya (RUS 2001).rar:2001- \357\277\275/02 \357\277\275\357\277\275\357\277\275.mp3' > archives.pls

(
export LANG='C'
#locale charmap
cat archives.pls | grep --perl-regexp 'Lika.*rar.*02'
cat archives.pls | grep --perl-regexp 'Lika.*rar.*02' | gsed -e 's/^\(zip\|rar\|7z\):\/\///' -e 's/\(\.\(zip\|rar\|7z\)\):.*/\1/'    # GNU sed 4.2.1
cat archives.pls | grep --perl-regexp 'Lika.*rar.*02' | gnused -e 's/^\(zip\|rar\|7z\):\/\///' -e 's/\(\.\(zip\|rar\|7z\)\):.*/\1/'  # GNU sed 4.2.2
cat archives.pls | grep --perl-regexp 'Lika.*rar.*02' | gsed -e 's/^\(zip\|rar\|7z\):\/\///' -e 's/\(\.\(zip\|rar\|7z\)\):\([^[:print:]]\|[[:print:]]\)*/\1/'
)


# output:
# rar:///home/andy/audio_compressed/world/ru/Lika Star - Ya (RUS 2001).rar:2001- �/02 ���.mp3
# /home/andy/audio_compressed/world/ru/Lika Star - Ya (RUS 2001).rar�/02 ���.mp3
# /home/andy/audio_compressed/world/ru/Lika Star - Ya (RUS 2001).rar
# /home/andy/audio_compressed/world/ru/Lika Star - Ya (RUS 2001).rar

#--------------

(
export LANG='en_US.UTF-8'
#locale charmap
cat archives.pls | grep --perl-regexp 'Lika.*rar.*02'
cat archives.pls | grep --perl-regexp 'Lika.*rar.*02' | gsed -e 's/^\(zip\|rar\|7z\):\/\///' -e 's/\(\.\(zip\|rar\|7z\)\):.*/\1/'    # GNU sed 4.2.1
cat archives.pls | grep --perl-regexp 'Lika.*rar.*02' | gnused -e 's/^\(zip\|rar\|7z\):\/\///' -e 's/\(\.\(zip\|rar\|7z\)\):.*/\1/'  # GNU sed 4.2.2
cat archives.pls | grep --perl-regexp 'Lika.*rar.*02' | gsed -e 's/^\(zip\|rar\|7z\):\/\///' -e 's/\(\.\(zip\|rar\|7z\)\):\([^[:print:]]\|[[:print:]]\)*/\1/'
)

# output:
# rar:///home/andy/audio_compressed/world/ru/Lika Star - Ya (RUS 2001).rar:2001- �/02 ���.mp3
# /home/andy/audio_compressed/world/ru/Lika Star - Ya (RUS 2001).rar
# /home/andy/audio_compressed/world/ru/Lika Star - Ya (RUS 2001).rar
# /home/andy/audio_compressed/world/ru/Lika Star - Ya (RUS 2001).rar
1
28.01.2020, 05:15

Теги

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