извлечь символы из второго вхождения da sh в строке - PullRequest
0 голосов
/ 15 февраля 2020

У меня есть строка " apple-rose-orange-21-X-84 "; Мне нужно извлечь строку после второго вхождения « - » с помощью сценария оболочки.

Ответ должен быть orange-21-X-84 .

Как бы я это сделал в сценарии оболочки, я пробовал несколько способов, не мог найти ответ.

Ответы [ 3 ]

2 голосов
/ 15 февраля 2020

решение только для оболочки:

string='apple-rose-orange-21-X-84'
echo ${string#*-*-}

См. Расширение параметров оболочки

$ {параметр # слово}

$ {параметр ## слово}

Слово расширяется для создания шаблона и сопоставления в соответствии с правилами, описанными ниже (см. Сопоставление шаблонов). Если шаблон соответствует началу расширенного значения параметра, то результатом расширения является расширенное значение параметра с самым коротким соответствующим шаблоном (случай «#») или самым длинным соответствующим шаблоном (случай «##») удален. Если параметр равен «@» или «», операция удаления шаблона применяется по очереди к каждому позиционному параметру, и расширение является результирующим списком. Если параметром является переменная массива, подписанная с помощью «@» или «», операция удаления шаблона применяется к каждому члену массива по очереди, и расширение является результирующим списком.

1 голос
/ 15 февраля 2020

Вы можете использовать команду cut:

$ cut -d- -f3- <<<'apple-rose-orange-21-X-84'
orange-21-X-84

-d- устанавливает da sh в качестве разделителя среза. -f3- выбирает от 3-го до последнего поля. <<< делает здесь строку. Для более подробного объяснения см. man cut и man bash.

0 голосов
/ 16 февраля 2020

Вот несколько POSIX методов оболочки (без bash или внешних утилит, необходимых):

  1. Использование каналов и read:

    echo apple-rose-orange-21-X-84 | (IFS="-" read a b c; echo $c;)
    
  2. Использование подстановки параметров:

    s=apple-rose-orange-21-X-84; echo ${s#*-*-}
    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...