извлечение строки bash

Я хотел бы извлечь второе поле из последней части следующих строк:

foo_1.103.debug_xx.ver21-inc-1 --> string extracted "debug_xx" foo_1.103.1.0.release_32_xx.ver21-inc-1 --> string extracted "release_32_xx" foo_1.103.1.0.release_xx.ver21-inc-1 --> string extracted "release_xx" 

Любая помощь будет оценена.

  • Как удалить все файлы, кроме имени файла (без расширения) из полного пути к файлу?
  • Удалите все повторяющиеся слова из строки, используя сценарий оболочки
  • Удалить полную строку в текстовых файлах на основе тегов
  • Функция, вызывающая другую функцию со списком аргументов, не работает
  • Имя пути в сценарии оболочки содержит дополнительные символы при запуске скрипта
  • повторение значения из функции BASH после выполнения команды в фоновом режиме
  • Что делает эта команда с обратной косой чертой в конце?
  • Как запустить программу, которая имеет собственную командную строку в программе сценария оболочки
  • 4 Solutions collect form web for “извлечение строки bash”

    Используйте ${VAR%PATTERN} чтобы удалить суффикс, соответствующий последнему полю, а затем ${NEWVAR##PATTERN} чтобы удалить префикс, соответствующий всем, кроме последнего оставшегося поля.

     all_but_last_field=${mystring%.*} second_to_last_field=${all_but_last_field##*.} 

    Вам нужно сохранить строку в переменной и сохранить промежуточный результат в переменной также, вы не можете напрямую связывать расширения (вы можете в zsh, но не в bash).

    С чистым bash :

     IFS='.' read -ap <<< 'foo_1.103.1.0.release_32_xx.ver21-inc-1' echo "${p[${#p[@]}-2]}" 

    Вы можете сделать это проще с awk :

     awk -F. '{print$(NF-1)}' <<< 'foo_1.103.1.0.release_32_xx.ver21-inc-1' 

    Если ваши строки для разбора являются именами файлов, вы все равно можете сделать это с помощью awk :

     awk -F. 'BEGIN{for(i=1;i<ARGC;i++){$0=ARGV[i];print$(NF-1)}}' foo* 

    Команда sed для этого:

     sed 's/foo_[0-9.]*\([^.]*\).*/\1/' inputfile 

    Предполагая, конечно, что inputfile содержит ваши строки, каждый на своей собственной строке (как кажется вашим примером). Если вы говорите, что используете имена файлов, тогда будет работать и вывод результатов ls в sed .

    предполагая, что это файлы:

    ls foo * | awk -F. '{print $ 3}'

    Linux и Unix - лучшая ОС в мире.