Извлечение строки в соответствии с шаблоном в сценарии bash

В bash предположим, что у меня есть строка strname:

strname="ph7go04325r"

Я хотел бы извлечь символы между символами first "3" и последним "r" в strname, сохраняя результат в строке strresult. В приведенном выше примере полученный strresult будет:

strresult="25"

Первый символ "3" не обязательно в строке 8 в strname; аналогично, последний "r" является not обязательно в строковой позиции 11. Таким образом, обе следующие строки strname должен давать strresult="25":

strname="ph11go04325raa"
strname="325r"
strname="rgo04325raa"

Кроме того, strname=ph12go04330raa" должен давать strresult="30".

Я новичок в сценариях bash, и я не знаю, с чего начать, как это сделать. У вас есть предложения?

16 голосов | спросил Andrew 4 FebruaryEurope/MoscowbMon, 04 Feb 2013 23:56:37 +0400000000pmMon, 04 Feb 2013 23:56:37 +040013 2013, 23:56:37

1 ответ


10

В стандартном синтаксисе sh (так будет работать с любой версией bash или любой другой совместимый с POSIX-оболочкой), вы должны:

case $strname in
  (*3*r*) 
    strresult=${strname#*3}
    strresult=${strresult%r*};;
  (*)
    printf >&2 '%s\n' "Unable to parse string $strname"
esac

См. также старое решение expr, которое будет работать даже на 35-летних Unices:

expr "x$strname" : 'x[^3]*3\(.*\)r'

Старый quirk с expr заключается в том, что если совпадение не получается, вы получаете ненулевой статус выхода (отлично), но вы также получаете ненулевой статус выхода, если возвращаемые строки разрешаются до 0 (например, с помощью strname=zz300rzz).

ответил Stéphane Chazelas 5 FebruaryEurope/MoscowbTue, 05 Feb 2013 00:21:03 +0400000000amTue, 05 Feb 2013 00:21:03 +040013 2013, 00:21:03

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132