Может ли кто-нибудь объяснить подстроку bash, соответствующую мне?

Я хорошо знаком с регулярными выражениями в разных контекстах, но подстрока bash меня просто сбивает с толку. Может кто-нибудь, пожалуйста, объясните мне это, в идеале, с некоторыми примерами? Примеры, которые я нашел в google, очень просты и предлагают довольно общее (если ограничено) соответствие регулярному выражению, но когда я пытаюсь использовать их в практических ситуациях, он никогда не работает. По моему пониманию подстрока должна работать следующим образом:

result=${string##pattern} 

найдет самую длинную подстроку «string», начиная с ее начала, которая соответствует «pattern». Он удаляет это совпадение из 'string' и помещает остаток в 'result'. Но учтите:

 temp=${myvar##[^0-9]*} && echo $temp 

Насколько я могу судить, мой шаблон должен соответствовать «ноль или больше символов, которые не являются цифрами» – самый длинный из таких совпадений с начала строки. Затем возьмите пример:

 myvar=my_file_123_45.txt 

Я должен ожидать, что символы «my_file_» будут сопоставляться: это самая длинная комбинация символов с начала строки, которые не являются цифрами. Вместо этого возвращаемый результат пуст! Все подбирается! Что случилось с исключением цифр ?! В обоих gedit (с использованием механизма поиска и замены regex) и в инструментах регулярного выражения Labview шаблон соответствия

 pattern=^[^0-9]* 

который, как я полагаю, эквивалентен, приводит к ожидаемому совпадению – «my_file_». Чем отличается Баш?

One Solution collect form web for “Может ли кто-нибудь объяснить подстроку bash, соответствующую мне?”

Вам нужно понять, что подшаговое соответствие Bash НЕ использует regexes. Скорее, он использует wildcard expansion в тандеме с # ## %%%, чтобы посмотреть кратчайшие и самые длинные совпадения и с любого направления.

В вашем конкретном случае, когда вы хотите захватить ведущие цифры, вы можете использовать следующую стратегию:

 echo "${myVar%%[0-9]*}"; # delete upto the leftmost digit starting from right 

вывод

 my_file_ 

Я нашел следующий сайт: http://www.tldp.org/LDP/abs/html/parameter-substitution.html особенно удобный для всех связанных с Bash вопросов.

  • Регулярные выражения помогают
  • sed шаблон, за которым следует один одиночный символ один или несколько раз
  • Регулярное выражение, соответствующее X-идентификаторам сеанса?
  • Сценарий Bash для копирования определенных каталогов с сопоставлением с образцом
  • Обрезка одной части, если она равна другой части?
  • Можно использовать параметр сценария bash?
  • regexp в ksh для расширений tgz, tar.tgz
  • Почему perl regex находит шаблон \\ label \ {. *? \}, Но не \\ ref. *? \} Или \\ autoref \ {. *? \} В файлах TeX?
  • Регулярное выражение для поиска двойных символов в Bash
  • регулярное выражение для извлечения информации в сценарии оболочки
  • Vim: подсчитывать все вхождения (в том числе несколько в одной строке) символа или слова
  • Замените что-либо между круглыми скобками, даже если они охватывают несколько строк
  • Interesting Posts

    Ошибка: файл содержит ошибки синтаксического анализа: файл: /////etc/yum.repos.d/dag.repo

    Как отслеживать ошибки RAM ECC на процессоре Ivy Bridge Xeon E3 в Linux?

    Использование xdg-open odt файлов

    Как извлечь список учетных записей пользователей, удаленных из системы в течение 1 года?

    Какой пользователь выполняет команды vi как?

    Как я могу сделать вывод по умолчанию для цветового кодирования bash?

    Как смотреть видео на DVD с внешними субтитрами в Linux?

    Неверное поведение команды сортировки

    Почему эта бомба вилка-раковины не работает на моей RHEL VM?

    Как Linux находит правильное расположение программного пакета

    sed удалить конец строки для определенных строк

    Что такое фиктивные значения nlink файла?

    Количество символов в команде Unix wc

    Список доступных параметров команды?

    Почему запуск rxvt-unicode с расширением perl включен по умолчанию, хотя я построил его с помощью «–enable-perl» и даже «–enable-everything»?

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