LINUX.ORG.RU

ksh, строки, bad substitution


0

1

Привет.Опыта в написании скриптов не имею,но вот возникла необходимость переименовать файлы в каталоге,для этих целей такой скрипт:

#!/bin/ksh
for i in  *.ext
do
ii=`basename $i .ext`
echo $ii
ii=${ii//,/}
ii=${ii:0:21}
echo $ii
cat $i > $ii
done
exit 1

в общем надо убрать знаки препинания, расширение и обрезать имя до нужной длинны.Получаю ./script/test.sh[7]: ii=${ii//,/}: bad substitution


Поторопился,как всегда,поменял #!/bin/ksh на #!/bin/bash,все заработало.Но другой вопрос возник,как сделать так чтоб к имени файла добавлялся порядковый номер в формате 10 значного числа,с нулями слева 0000000001,0000000002 и т.д.?

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

как сделать так чтоб к имени файла добавлялся порядковый номер в формате 10 значного числа,с нулями слева 0000000001,0000000002 и т.д.?

Я не эксперт баша, так что может быть костыльно:

number=$(seq -s '' 1 $(expr 10 - length $i) | tr '[0-9]' 0)$i
i — порядковый номер, number — итоговое 10-значное число.

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

как всегда,поменял #!/bin/ksh на #!/bin/bash,все заработало

octalfacepalm.tiff

Jetty ★★★★★
()

Да,printf =) оставил так,вроде делает что надо.

#!/bin/bash
shopt -s nullglob 
tmp_count=0
for i in  *.ext
do
ii=`basename "$i" .ext`
ii=${ii:0:11}$(printf "%010d" $tmp_count)
awk 'BEGIN{FS="|";}{var=$72-$70; print ($1"|"$2"|"$69"|"$3"|"var"|"$5"|"$6"|"$7"|"$8"|"$9"|"$10"|"$11"|"$12"|"$70"|"$13"|"$14"|"$15"|"$16"|"$17"|"$18"|"$19"|"$20"|"$21"|"$22"|"$23"|"$24"|"$25"|"$26"|"$27"|"$28"|"$29"|"$30"|"$31"|"$32"|"$33"|"$34"|"$35"|"$36"|"$37"|"$38"|"$39"|"$40"|"$41"|"$42"|"$43"|"$44"|"$45"|"$46"|"$47"|"$48"|"$49"|"$50"|"$71"|"$51"|"$52"|"$53"|"$54"|"$55"|"$56"|"$57"|"$58"|"$59"|"$60"|"$61"|"$62"|"$63"|"$64"|"$65"|"$66"|"$68);}' "$i" > $ii
rm "$i"
tmp_count=$((tmp_count+1))
done
exit 1

Если можно оптимизировать,с радостью почитаю.)

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

Сейчас нет под рукой,но там просто набор полей,скрипт меняет местами некоторые,ну и кое что отбрасывает.awk работает отлично.

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

Не знаю насчёт оптимизации, но print в awk выглядит страшно. Я бы сделал вывод циклами, как-то так:

for (i=51; i<=66; i++) prinft "%s|", $i;
printf "%s\n", $68 

Скорости это не добавит, но, ИМХО, запись будет попроще.

mky ★★★★★
()

Что-то я пожалел, что связался с этими гнутыми утилитами под виндой=) в общем появилась задача,в файлах xml между последним тегом(закрывающим) и предпоследним есть мусор,который надо бы повырезать,скачал sed.exe и awk.exe.

sed -f 2.sed file.xml говорит

sed: файл 2.sed строка 1: недопустимая ссылка \1 на RHS команды `s'
, в 2.sed
s/(<tag>.*<\/Or>|<\/Iif>)s*',\s*'\w*',.*(<\/tag>)/\1/
awk с таким правилом
{print gensub(/(<tag>.*(?:<\/O>|<\/I>))\s*',\s*'\w+',.*(<\/tag>)/, "\1\2", "g")}
выводит строку из файла без изменений.

в файле строка вида <tag>много xml'а с последним тегом </o> или </i> ,'мусор',еще мусор</tag>

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