«Недопустимый или неполный многобайтовый или расширенный символ» с «столбцом»

Убедитесь, что вы используете один из вариантов renameна основе perl-, иногда называемый prename, а не вариант из util-linux(, иногда называемыйrename.ul).

Вариант из util-linuxнамного более ограничен (, несмотря на то, что он намного новее ), использует другой синтаксис, может заменять только фиксированные строки и не может заменять все вхождения строки.

Здесь я бы использовал варианты perl rename, убедитесь, что вы конвертируете символы новой строки только в именах файлов,а не компоненты каталога, ведущие к ним, и используйте -depthдля обработки листьев перед ветвями.

perlраспознает \nкак символ новой строки, поэтому вам не нужно использовать $'...'в качестве аргумента кода (, хотя это нормально, если вы делаете вопреки тому, что я изначально думал ).

find. -depth -name $'*\n*' -exec rename '
  s{[^/]*\z}{$& =~ y/\n/ /r}e' '{}' +

Или используйте -execdir, если доступно (, хотя это будет запускать по крайней мере один renameв каталоге с файлами с \nв пределах):

find. -depth -name $'*\n*' -execdir rename 'y/\n/ /' {} +

Или вы можете использовать zsh'szmv:

autoload zmv
NL=$'\n'
zmv "(**/)(*$NL*)(#qD)" '$1${2//$NL/ }'

(, который, в отличие от подходов, основанных на find-, будет по-прежнему работать, даже если имена файлов содержат последовательности байтов, которые не образуют допустимых символов. Он также отключится без каких-либо действий, если обнаружит конфликт ).

1
15.01.2021, 16:51
1 ответ

Если вы хотите напечатать æ в нижнем регистре Unicode, то есть u00E6, вы можете использовать это:

$ printf '\u00E6\n' 
æ

Итак, если ваш файл выглядит так:

$ printf 'foobarbaz\u00E6bar\u00E6baz bar something else whohooo!\n' 
foobarbazæbaræbaz bar something else whohooo!

Вы можете использовать такой столбец:

$ printf 'foobarbaz\u00E6bar\u00E6baz bar something else whohooo!\n' | 
    column -ts$'\u00E6' -o "::::::::"
foobarbaz::::::::bar::::::::baz bar something else whohooo!

Обратите внимание на escape-формат ANSI($'characterCode'). Я использовал -o "::::::::", чтобы вы могли легко увидеть столбцы.

2
18.03.2021, 22:36

Теги

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