Индексировать строку в bash

Как я могу ссылаться на строку по индексу в sh / bash? То есть, в основном, расщепляя его.

Я пытаюсь удалить 5 символов имени файла. Все имена имеют структуру: name_nr_code. Я пытаюсь удалить 5 буквенно-цифровых бит кода. name_nr_ всегда 10 символов.

Есть такая вещь;

for i in * ; do mv "$i" "$i"[:10] ; done

  • python Vs bash string slicing
  • имя файла без пробелов из двух команд
  • Используйте «find» из определенного относительного каталога
  • как разбить строку после и перед пространством в сценарии оболочки?
  • Преобразование MAC-адреса в локальный адрес ссылки с помощью bash
  • Поиск различного имени файла в цикле
  • Проблема с использованием expr
  • Извлечь имя базового файла из URL с помощью bash
  • 5 Solutions collect form web for “Индексировать строку в bash”

    Просто так.

    (Баш)

     for i in * ; do mv -- "$i" "${i:0:5}" ; done 

    Вуаля.

    И объяснение из руководства Advanced Bash-Scripting Guide ( Глава 10. Манипулирование переменными ) (с дополнительным примечанием s, чтобы выделить ошибки в этом руководстве):

    Экстракция подстроки

     ${string:position} 

    Извлекает подстроку из $string в $position .

    Если параметр $string – «*» или «@», тогда он извлекает позиционные параметры, начиная с $position .

     ${string:position:length} 

    Извлекает $length символов подстроки из $string в $position .

    ПРИМЕЧАНИЕ. Отсутствие котировок вокруг разложений параметров! echo не должно использоваться для произвольных данных.

     stringZ=abcABC123ABCabc # 0123456789..... # 0-based indexing. echo ${stringZ:0} # abcABC123ABCabc echo ${stringZ:1} # bcABC123ABCabc echo ${stringZ:7} # 23ABCabc echo ${stringZ:7:3} # 23A # Three characters of substring. # Is it possible to index from the right end of the string? echo ${stringZ:-4} # abcABC123ABCabc # Defaults to full string, as in ${parameter:-default}. # However . . . echo ${stringZ:(-4)} # Cabc echo ${stringZ: -4} # Cabc # Now, it works. # Parentheses or added space "escape" the position parameter. 

    Аргументы позиции и длины могут быть «параметризованы», то есть представлены как переменная, а не как численная константа.


    Если параметр $string имеет значение «*» или «@», тогда он извлекает максимальные позиционные параметры $length , начиная с $position .

     echo ${*:2} # Echoes second and following positional parameters. echo ${@:2} # Same as above. echo ${*:2:3} # Echoes three positional parameters, starting at second. 

    ПРИМЕЧАНИЕ : expr substr является расширением GNU.

     expr substr $string $position $length 

    Извлекает $length символов из $string начиная с $position .

     stringZ=abcABC123ABCabc # 123456789...... # 1-based indexing. echo `expr substr $stringZ 1 2` # ab echo `expr substr $stringZ 4 3` # ABC 

    ПРИМЕЧАНИЕ . Это echo избыточно и делает его еще менее надежным. Используйте expr substr + "$string1" 1 2 .

    ПРИМЕЧАНИЕ : expr вернется с ненулевым статусом выхода, если выход равен 0 (или -0, 00 …).


    КСТАТИ. Книга находится в официальном репозитории Ubuntu как abs-guide .

    В 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] для первого символа до шестого с конца (так что все, кроме последних 5).
    • $var[1,10] для первых 10 символов.

    С ksh , bash или zsh :

    • "${var:0:10}" : первые 10 символов $var

    С bash или zsh :

    • "${var:0:-5}" : все, кроме последних 5 символов (выдает ошибку и выходит из скрипта, если $var установлен, но содержит менее 5 символов, также когда $var не задано с zsh ).

    Если вам нужна совместимость с Bourne sh , это очень сложно сделать надежно. Если вы можете гарантировать, что результат не закончится символами новой строки, которые вы можете сделать:

     first_10=`expr " $var" : ' \(.{1,10\}\)'` # beware the exit status # may be non-zero if the # result is 0 or 0000000000 all_but_last_5=`expr " $var" : ' \(.*\).\{5\}'` 

    У вас также будет ограничение на длину $var (варьируется между системами).

    Во всех этих решениях, если $var содержит байты, которые не могут быть частью допустимых символов, YMMV.

    Большинство оболочек поддерживают какое-то расширение параметров, которое может вам помочь. В bash вы можете использовать

     substr=${string:4:5} # start at position 4, length 5. 

    В dash смещения не поддерживаются, но вы можете использовать ведущие и завершающие шаблоны:

     remove_first3=${string#???} remove_last2=${string%??} 

    sh не обеспечивает встроенный способ получения подстроки из строки (насколько я могу видеть), но с помощью bash вы можете делать

     ${i:0:10} 

    Это даст вам первые десять символов значения переменной i .

    Общий формат: ${variable:offset:length} .

    Прежде всего, не используйте цикл for для имен файлов.

    Тогда что-то вроде этого должно помочь.

     find ./ -type f | while read filename ;do newfilename=$(echo ${filename}|cut -c 1-10) mv ${filename} ${newfilename} done 
    Interesting Posts
    Linux и Unix - лучшая ОС в мире.