LINUX.ORG.RU

bash & tr & russian

 


0

1

Можно ли заставить tr работать для названий на русском?

for name in 'A$BC' 'E$FG' 'ТАКОЕ'
do
	objectname=$( tr -dc '[[:print:]]' <<< "$name") # remove eol
	filename=$( tr '[:upper:]' '[:lower:]' <<< "$objectname") # to lowercase
	echo name= "$name" obj= "$objectname"  file="$filename"
done

Вывод

name= A$BC obj= A$BC file=a$bc
name= E$FG obj= E$FG file=e$fg
name= ТАКОЕ obj=  file=

★★★★

Последнее исправление: Psilocybe (всего исправлений: 1)

tr не поддерживает мультибайтные кодировки, а скорее всего используется UTF-8.
Как альтернатива tr использовать sed:

sed 'y/ЙЦУКЕНГШЩЗХЪФЫВАПРОЛДЖЭЯЧСМИТЬБЮЁ/йцукенгшщзхъфывапролджэячсмитьбюё/'

NeoZX
()

Ну раз bash, то filename=${objectname,,} Спициально же делают синтаксис чтобы быстрее работало и выглядело компактнее, нет же, как специально городят вызов внешних команд и типа круче, если код побольше...

vodz ★★★★★
()

Спасибо всем!!

Заменил tr на sed

(Что бы два раза не вставать)

Куда в этом примере делся вывод name=?

input.txt:

A$BC
E$FG
ТАКОЕ

скрипт:

for name in $( cat input.txt )
do
	objectname=$( sed 's/\n//' <<< "$name") # remove eol
	filename=${objectname,,} #to lowercase
	echo name= "$name" obj= "$objectname"  file="$filename"
done

вывод:

 obj= A$BC file=a$bc
 obj= E$FG file=e$fg
name= ТАКОЕ obj= ТАКОЕ file=такое
Psilocybe ★★★★
() автор топика
Ответ на: комментарий от Psilocybe

Замените для начала вот этот ужас с for и sed на

while read objectname
do
  filename=${objectname,,}
  echo ...
done < input.txt
А потом уже будем разбираться, куда у вас что делось, а то в таком даже разбираться не хочется.

vodz ★★★★★
()
Последнее исправление: vodz (всего исправлений: 1)
Ответ на: комментарий от vodz

Заменить неполучится. Это относительно минимальный скрипт для воспроизводства проблемы. В реальности поток имен идет с внешней утилиты и да, там \n в конце имени, так что сразу в objectname тоже нельзя. Нужно делать objectname=$( sed 's/\n//' <<< "$name") # remove eol или как-то по другому удалять перевод строки.

Psilocybe ★★★★
() автор топика
Ответ на: комментарий от Psilocybe

Ну так и читайте этот поток, после переменной \n и так является символом завершения строки чтения read и в переменной его не будет, а пустые строки можно дополнительно проверять на пустое objectname

vodz ★★★★★
()
Ответ на: комментарий от vodz

Благодарю за помощь. Пришел к выводу что причина пропадания name= в кривой реализации bash под офтопик в mingw64 под офтопик (приходится там скриптовать, да), так как дома под Минт это не воспроизводится.

Psilocybe ★★★★
() автор топика