Может ли кто-нибудь объяснить подстроку 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_». Чем отличается Баш?

  • Как заменить этот шаблон на новую строку внутри?
  • sed регулярное выражение ведет себя иначе, чем в vim и perl?
  • Как совпадают обратные ссылки в sed?
  • Regex go Wrong
  • Удалить строку между двумя разными разделителями
  • Соответствие гексадецималов с gawk
  • Хотите заменить слова пространством в нескольких файлах, используя SED commmand
  • Использование sed для замены строки, содержащей целые переменные
  • 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 вопросов.

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