LINUX.ORG.RU

Подскажите, пожалуйста, скрипт или какие маны читать.


0

1

Есть около тысячи файлов с русскими названиями. При этом, они являются парными:один является описанием к другому, и содержит его название(опять же, русское) на третьей строке. Надо перевести в транслит имена этих файлов, а так же третьи строки каждого второго файла. Посоветуйте, пожалуйста, какие маны читать, ну или готовый скрипт...


Бери любой язык который знаешь и пиши, делов то.

Если ни одного не знаешь, то баш.

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

А как еще заменятьбуквы/слова?

а блин, забыл про это. извини.
хотя.. можно, наверное, извратиться а=a, б=b, в=v =)

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

Ну, траслитеряцию(или как оно называется) я уже и так реализовал sed'ом. Банальная замена щ на sh' и так далее...

Vekt ()

Я тут столкнулся с проблемой, не знаю, как решить. Есть 2 файла: тест1 и тест2. Тест2 в третьей строке содержит имя первого файла: тест1. Вот скрипт:

awk '(NR == 3)' тест2 | sed -e 's/а/a/' -e 's/б/b/' -e 's/в/v/' -e 's/г/g/' -e 's/д/d/' -e 's/е/e/' -e 's/ж/zh/' -e 's/з/z/' -e 's/и/i/' -e 's/к/k/' -e 's/л/l/' -e 's/м/m/' -e 's/н/n/' -e 's/о/o/' -e 's/п/p/' -e 's/р/r/' -e 's/с/s/' -e 's/т/t/' -e 's/у/u/' -e 's/ф/ph/' -e 's/х/h/' -e 's/ц/c/' -e 's/щ/sh/' -e 's/ш/sh/' -e 's/ч/ch/' -e 's/э/e/' -e 's/ю/yu/' -e 's/я/ya/' >> t
Таким образом, берется третья строка файла «тест2» и к ней применяется sed, который транслитерирует ее, и выводит результат в файл «t». Но мне надо другое- просто применить sed к третьей строке, не трогая остальное. Тупо изменить третью строку. Как?

Vekt ()
cat ~/bin/rename_translit
#!/bin/sh
# this script has been written by Eddy 
#
#		rename_translit --- переводит русские имена файлов в транслит
#
# Создан 22-го Май 2006 года в  9:24
#
rmspaces
for Name in `ls -1`
do
    Newname=`echo "$Name"|enconv|sed -e \
    "y/йукенгзхъфывапролдэсмитьбЙУКЕНГЗХЪФЫВАПРОЛДЭСМИТЬБ/jukengzh'fyvaproldesmit'bJUKENGZH'FYVAPROLDESMIT'B/"\
    -e "s/ц/tz/g"	\
    -e "s/ш/sh/g"	\
    -e "s/щ/sch/g"	\
    -e "s/ж/zh/g"	\
    -e "s/ч/ch/g"	\
    -e "s/ю/yu/g"	\
    -e "s/я/ya/g"	\
    -e "s/ё/yo/g"	\
    -e "s/Ё/YO/g"	\
    -e "s/Ц/TZ/g"	\
    -e "s/Ш/SH/g"	\
    -e "s/Щ/SCH/g"	\
    -e "s/Ж/ZH/g"	\
    -e "s/Ч/CH/g"	\
    -e "s/Ю/YU/g"	\
    -e "s/?/_/g"	\
    -e "s/Я/YA/g"`
    if [ "$Name" != "$Newname" ]; then
        mv "$Name" "$Newname"
	echo -e "$Name   ->    $Newname                             \r\c"
    fi
    if [ -d "$Newname" ]; then
	cd "$Newname"
	echo -e "\n\nDiving into $Newname"
	rename_translit
	cd ../
    fi
done

И примерно такой же скриптик для декодирования файла в транслит:

#!/bin/sh
# this script has been written by Eddy 
#
#		encode2translit --- перекодирует содержимое файлов в транслит
#
# Создан 22-го Май 2006 года в  9:24
#
cat $1|sed -e \
    "y/йукенгзхъфывапролдэсмитьбЙУКЕНГЗХЪФЫВАПРОЛДЭСМИТЬБ/jukengzh'fyvaproldesmit'bJUKENGZH'FYVAPROLDESMIT'B/"\
    -e "s/ц/tz/g"	\
    -e "s/ш/sh/g"	\
    -e "s/щ/sch/g"	\
    -e "s/ж/zh/g"	\
    -e "s/ч/ch/g"	\
    -e "s/ю/yu/g"	\
    -e "s/я/ya/g"	\
    -e "s/ё/yo/g"	\
    -e "s/Ё/YO/g"	\
    -e "s/Ц/TZ/g"	\
    -e "s/Ш/SH/g"	\
    -e "s/Щ/SCH/g"	\
    -e "s/Ж/ZH/g"	\
    -e "s/Ч/CH/g"	\
    -e "s/Ю/YU/g"	\
    -e "s/Я/YA/g" > $1.enc
Можно sed вынести в отдельную функцию и сваять простенький скриптик, который и переименовывать будет, и декодировать. Если сохранять надо в тот же файл, вывод > $1.enc убираем и добавляем к sed'у опцию -i.

Eddy_Em ☆☆☆☆☆ ()

Надо перевести в транслит имена этих файлов

mv + sed «y/абвгдезийклмнопрстуфхцы/abvgdezijklmnoprstufxcy/»`

а так же третьи строки каждого

awk

какие маны читать

http://www.tldp.org/LDP/abs/html/abs-guide.html

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

Я посмотрел скрипт, попробовал его(заменил $1 на имя файла). Я тут и сам, вроде, разобрался с преобразованием в транслит, но, вот что странно- ни твой скрипт, ни мой:

sed -e 's/а/a/' -e 's/б/b/' -e 's/в/v/' -e 's/г/g/' -e 's/д/d/' -e 's/е/e/' -e 's/ж/zh/' -e 's/з/z/' -e 's/и/i/' -e 's/к/k/' -e 's/л/l/' -e 's/м/m/' -e 's/н/n/' -e 's/о/o/' -e 's/п/p/' -e 's/р/r/' -e 's/с/s/' -e 's/т/t/' -e 's/у/u/' -e 's/ф/ph/' -e 's/х/h/' -e 's/ц/c/' -e 's/щ/sh/' -e 's/ш/sh/' -e 's/ч/ch/' -e 's/э/e/' -e 's/ю/yu/' -e 's/я/ya/' $1
тот файл не берут. На выходе все равно тот же самый файл, без изменений. Вот, кстати, он. http://zalil.ru/33145478. И второй вопрос, который меня очень волнует- Как в скрипте написать, чтобы он сначала обработал первый файл в той папке, потом второй и так далее...?

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

У меня он переименовался в O-37-137-D_1984_1985_Fryanovo_1.map

Как в скрипте написать, чтобы он сначала обработал первый файл в той папке, потом второй и так далее...?

В смысле?

Eddy_Em ☆☆☆☆☆ ()
Ответ на: комментарий от Vekt

OziExplorer Map Data File Version 2.2^M O-37-137-ц тПЪМНБН 1985Ц.^M E:\.0\0\O-37-137-D_1984_1985_тПЪМНБН_1.jpg^M

Тут еще и через enconv или iconv придется сначала пропускать, раз уж названия русские, да еще и в странной кодировке.

Eddy_Em ☆☆☆☆☆ ()
Ответ на: комментарий от Eddy_Em

В общем, вот так:

dos2unix O-37-137-D_1984_1985_Фряново_1.map 
dos2unix: converting file O-37-137-D_1984_1985_Фряново_1.map to Unix format ...

enconv O-37-137-D_1984_1985_Фряново_1.map 

encode2translit O-37-137-D_1984_1985_Фряново_1.map 
Получилось. Теперь в шапке файла:
OziExplorer Map Data File Version 2.2
O-37-137-G Fryanovo 1985g.
E:\.0\0\O-37-137-D_1984_1985_Fryanovo_1.jpg

Eddy_Em ☆☆☆☆☆ ()
Ответ на: комментарий от Eddy_Em

Я сейчас имею в виду не переименование файла, а переведение в трансил его содержимого. Ну, sed будет изменять тот файл, который ему указан. Как сделать так, чтобы он так прошелся по всем файлам в папке и сохранил их с соответствующими названиями? Там их просто около 500)

Vekt ()
Ответ на: комментарий от Eddy_Em

При перекодировании файла помимо замены русского на транслит надо бы еще всякую гадость, вроде «E:\.0\0\» подчистить, как-то так:

sed -i 's/E:\\\.0\\0\\//' файл

Eddy_Em ☆☆☆☆☆ ()
Ответ на: комментарий от Vekt

Простейший вариант: взять мой скриптик переименования, воткнуть туда для файлов еще и выполнение dos2unix, enconv и sed -i.

Eddy_Em ☆☆☆☆☆ ()
Ответ на: комментарий от Eddy_Em

Я все это немного приспособил для своих целей- куча(больше 1000) файлов, из которых только половина подлежит перекодировке в транслит(имеют расширение .map): $(printf '%b\n' $(ls) | grep ".map") && enconv $(printf '%b\n' $(ls) | grep ".map") && encode2translit $(printf '%b\n' $(ls) | grep ".map")

Vekt ()
Ответ на: комментарий от Eddy_Em

Кстати, вот еще вопросик не по теме- у меня тут есть скрипт, взятый с ArchWiki(смотрит список всех файлов в системе, смотрит список файлов, установленных пакетами и сравнивает их). Я в конце приписал сортировку-потому что на выходе файлов очень много, а все смотреть лень. Но, почему-то, через сортировку не проходит НИЧТО, хотя я четко указал, какие строки должны вырезаться. Не мог бы ты посмотреть, что не так в команде?

sed -e '/\/boot\/*/d' -e '/\/etc\/ssl/d' -e '/\/share\/mime/d' -e '/archiso/d' -е '/locale-archive/d' -e'/*.cache/d' -e '/font/d' -e '/flash/d' -e '/info\/dir/d' -e '/testiso/d' -e '/cups/d' -e '/shadow/d' -e '/localtime/d' -e '/ld.so/d' -e '/xorg.conf/d' non-db.txt >> non-db-sorted.txt

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

Вот так работает?

echo "/usr/lib/libastral.so" | sed -e '/\/boot\/*/d' -e '/\/etc\/ssl/d' -e '/\/share\/mime/d'  -e '/archiso/d' -e '/locale-archive/d' -e '/*.cache/d' -e '/font/d' -e '/flash/d' -e '/info\/dir/d' -e '/testiso/d' -e '/cups/d' -e '/shadow/d' -e '/localtime/d' -e '/ld.so/d' -e '/xorg.conf/d'
(должно вывести /usr/lib/libastral.so)

Eddy_Em ☆☆☆☆☆ ()
Ответ на: комментарий от Eddy_Em

У меня тут с вашим скриптом небольшие проблемы... Я не знаю, как ему скормить кучу файлов... ни *.map, ни мой длинный вариант не работают- очевидно. Если файлы по одному ему давать-работает. кучей-нет(

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

Это про тот, который меняет начинку. Переименовывающий нормально отработал.

Vekt ()

Посоветуйте, пожалуйста, какие маны читать, ну или готовый скрипт...

я такое вроде писал на sed.drbatty.ru

drBatty ★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.