Как я могу ссылаться на строку по индексу в sh / bash? То есть, в основном, это разделение.
Я пытаюсь удалить 5 символов имени файла. Все имена имеют структуру: name_nr_code. Я пытаюсь удалить 5 буквенно-цифровой кодовый бит. name_nr_
всегда 10 символов.
Есть ли вещь, как;
for i in * ; do mv "$i" "$i"[:10] ; done
bash
тэг, если вы спрашиваетеsh
решение?Ответы:
Просто как это.
(Баш)
Вуаля.
И объяснение из Advanced Bash-Scripting Guide ( Глава 10. Управление переменными ) (с дополнительными NOTEs встроенными, чтобы выделить ошибки в этом руководстве):
NOTEпропущенные кавычки вокруг расширений параметров!
echo
не должен использоваться для произвольных данных.NOTE:
expr substr
расширение GNU.NOTEЭто
echo
избыточно и делает его еще менее надежным. Использованиеexpr substr + "$string1" 1 2
.NOTE:
expr
вернется с ненулевым состоянием выхода, если выход равен 0 (или -0, 00 ...).КСТАТИ. Книга присутствует в официальном репозитории Ubuntu as
abs-guide
.источник
${var:1}
не возвращаетсяvar
из «1-й позиции», а фактически из 2-й.В POSIX
sh
,"${var%?????}"
будет$var
лишен последних 5 символов хвостовых (или ,$var
если$var
содержит менее 5 символов)"${var%"${var#??????????}"}"
это первые 10 символов$var
."${var%_*}"
будет$var
лишен самой короткой строки , которая соответствует_*
в конце$var
(foo_bar_baz
->foo_bar
)."${var%%_*}"
: то же самое, но самое длинное совпадение вместо самого короткого (foo_bar_baz
->foo
).foo_bar_
:"${var%"${var##*_}"}"
(${var##pattern}
то же самое,${var%%pattern}
но искать шаблон в начале,$var
а не в конце).С
zsh
:$var[1,-6]
для первого символа до 6-го от конца (так что все, кроме последних 5).$var[1,10]
для первых 10 символов.С
ksh
,bash
илиzsh
:"${var:0:10}"
: первые 10 символов$var
С
bash
илиzsh
:"${var:0:-5}"
: все, кроме последних 5 символов (выдает ошибку и выходит из сценария, если$var
он задан, но содержит менее 5 символов, также если$var
он не установлен с помощьюzsh
).Если вам нужна
sh
совместимость с Bourne , это очень сложно сделать надежно. Если вы можете гарантировать, что результат не будет заканчиваться символами новой строки, вы можете сделать:У вас также будет ограничение на длину
$var
(в зависимости от системы).Во всех этих решениях, если они
$var
содержат байты, которые не могут входить в состав допустимых символов, YMMV.источник
sh
не предоставляет встроенный способ получения подстроки из строки (насколько я вижу), но сbash
вами может сделатьЭто даст вам первые десять символов значения переменной
i
.Общий формат есть
${variable:offset:length}
.источник
Большинство оболочек поддерживают какое-то расширение параметров, которое может вам помочь. В Bash вы можете использовать
В
dash
, смещения не поддерживаются, но вы можете использовать начальные и конечные шаблоны:источник
Во-первых, не используйте
for
цикл для имен файлов.Тогда что-то вроде этого должно помочь.
источник
for
с именами файлов?printf
чтобы быть более безопасным. ... иread -r
.for
был в порядке, за исключением, может быть, пропавших без вести--
. Я вижу как минимум 10 ошибок в ваших 4 строках кода! многие из которых хорошо известны как плохая практика, например, предположить, что имена файлов - одна строка, использовать эхо, пропущенные кавычки