Bash의 "foo-bar-baz"에서 "foo"를 추출하는 방법은 무엇입니까? [복사]

Bash의 "foo-bar-baz"에서 "foo"를 추출하는 방법은 무엇입니까? [복사]

fooBash의 문자열에서 콘텐츠를 추출 하려고 합니다 ."foo-bar-baz"

문자열 교체 또는 유사한 기능(외부 도구 없이)을 사용하여 이 작업을 수행하는 방법에 대한 아이디어가 있습니까?

나는 성공하지 않고 이것을 시도했습니다.

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

이것도 작동하지 않습니다.

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

정의를 얻는 방법에 대한 아이디어가 있습니까 bar?

답변1

$ str="foo-bar-baz"

$ echo "${str%%-*}"
foo

$ echo "${str##*-}"
baz

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

답변2

문자열에서 foo를 추출할 수 있습니다.

$ str="foo-bar-baz"
str= ${str%-*} #this will get the part foo-bar
str= ${str%-*} #this will fetch foo from the string foo-bar
echo $str

답변3

@heemayl이 이미 정답을 제시했지만 참조와 설명을 추가하려면 다음을 수행하세요.

에서 man bash:

   ${parameter%word}
   ${parameter%%word}
          Remove matching suffix pattern.  The word is expanded to produce a pattern just  as  in  pathname  expansion.   If  the  pattern
          matches a trailing portion of the expanded value of parameter, then the result of the expansion is the expanded value of parame-
          ter with the shortest matching pattern (the ‘‘%’’ case) or the longest matching pattern (the ‘‘%%’’ case) deleted.

하나의 기호만 사용하므로 %가장 긴 일치 항목 대신 가장 짧은 일치 항목이 제거됩니다.

참고로, 나는 최근에 공부하고 일반적 으로 텍스트 처리 작업을 bash하지 않는 사람들이 awk결국 텍스트 처리 작업을 하게 된다는 매우 정확한 관찰을 읽었습니다.bash완전히 잘못된 도구. 나는 약 5시간(저녁과 아침) 동안 90% awk(고급 기능을 제외한 모든 기능)를 배웠습니다.

당신이 하고 있는 일이 파일 이름이나 명령 매개변수 등으로 사용하기 위해 이 문자열을 제거하는 것뿐이라면 물론 괜찮습니다. 이것이 바로 이 기능이 존재하는 이유입니다 bash. 그러나 좀 더 고급스럽고 복잡한 문자열 저글링을 수행하는 경우에는높은하루 정도 공부하는 것이 좋습니다 awk. 수십배의 성과를 거둘 것입니다.

awk(나는 당신의 라벨이 문자열 저글링보다 더 도움이 될 것 같기 때문에 이것을 주로 언급합니다 .)bash

관련 정보