2015-12-01 1 views
1

Я пытаюсь извлечь foo из строки "foo-bar-baz" в bash.Как извлечь «foo» из «foo-bar-baz» в bash?

Любые идеи, как это сделать, используя замену строк или что-то подобное (без внешних инструментов).

Я попытался это, но он не работает:

$ str="foo-bar-baz" 
$ echo ${str%-*} 
foo-bar 

Это также не работает:

$ str="foo-bar-baz" 
$ echo ${str#*-} 
bar-baz 

Любые идеи, как получить только bar?

+0

Поперечный отправленный на Unix + Linux: http://unix.stackexchange.com/questions/246539/how-to-extract-foo-from-foo-bar -baz-in-bash – John1024

+0

Возможный дубликат [Как удалить суффикс файла и часть пути из строки пути в Bash?] (http://stackoverflow.com/questions/125281/how-do--remove- the-file-suffix-and-path-part-from-a-path-string-in-bash) – John1024

ответ

1
str="foo-bar-baz" 
echo ${str%%-*} 

Выход:

 
foo 
+0

Wow. Пожалуйста, объясни! – bodacydo

+0

См. Раздел [Расширение параметров оболочки] (http://tiswww.case.edu/php/chet/bash/bashref.html#SEC32) в разделе '$ {parameter %% word}'. %% - жадная версия%. – Cyrus

0

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

str="foo-bar-baz" 
foostr=${str//-*/} ## assign 'foo' to foostr 
echo $foostr  ## 'foo' 

примечание: с пропуском закрытия /, строка замены является как пустая оболочка.

0

Использование Bash соответствия регулярных выражений:

#!/bin/bash 
str="foo-bar-baz" 
pat="([^-]*)-([^-]*)-.*" 
[[ $str =~ $pat ]] 
echo "${BASH_REMATCH[1]}" # foo 
echo "${BASH_REMATCH[2]}" # bar