foo
Bash의 문자열에서 콘텐츠를 추출 하려고 합니다 ."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