2492 some string continues here
으로 변환하고 싶습니다.
2492
배쉬에서. 어떻게 해야 하나요?
가까운 것 같지만 작동하지 않습니다.
var="2492 some string continues here "
echo ${var%[[:space:]]*}
답변1
사용하고 싶은 공간이 여러 개 있기 때문에
${var%%[[:space:]]*}
# ...^^
삭제가장 긴공백으로 시작하는 후행 하위 문자열
간단히 공백을 사용하면 %
문자열의 마지막 공백인 0개 이상의 문자가 뒤따르는 가장 짧은 공백 시퀀스를 제거할 수 있습니다.
$ echo ">$var<"; echo ">${var%[[:space:]]*}<"; echo ">${var%%[[:space:]]*}<"
>2492 some string continues here <
>2492 some string continues here <
>2492<
그냥 찾고 계시다면첫번째 단어, 다음과 같이 할 수 있습니다.
read -r word rest_of_string <<<"$var"
echo "I have: $word"
IFS 변수를 변경하지 않았다고 가정하면 선행 공백이 처리됩니다.
답변2
%%
( ) ${var%% *}
대신 %
( ) 를 사용하는 간단한 해결책이 있습니다 ${var% *}
. 이렇게 하면 *
초기 공백( ) 뒤의 모든 내용이 제거됩니다 .
$ var='2492 some string continues here'
$ echo "${var%% *}"
2492
그러나 var의 문자열 앞에 공백이 있으면 실패합니다. 다음을 사용하여 선행 공백을 제거할 수 있습니다.
$ var=$' \t 2492 some string continues here '
$ var="${var#"${var%%[![:space:]]*}"}"
$ echo "$var"
2492 some string continues here
$ echo "${var%%[[:space:]]*}"
2492
이는 공백이 스페이스 탭 NL 또는 CR인 경우에도 작동합니다.
정규식
아마도 더 강력한 해결책은 정규식을 사용하는 것입니다.
$ var=$' \t 2492 some string continues here '
$ regex='^[[:space:]]*([^[:space:]]+)'
$ [[ $var =~ $regex ]] && var=${BASH_REMATCH[1]}
$ echo "$var"
2492
답변3
cut
구분 기호를 기준으로 문자열을 자르는 간단한 도구를 사용할 수도 있습니다 .
echo "$mystring" | cut -d' ' -f 1
어디:
-d' '
구분 기호를 공백으로 설정-f 1
첫 번째 필드 제공(구분 기호 기준)
답변4
bash 및 내장 명령만 사용하려면 다음을 사용할 수 있습니다.내부 필드 구분 기호(IFS) 및 정렬
set -f # To prevent filename globbing when creating the array, as pointed out by Kusalananda in the comments
array=(2492 some string continues here)
set +f # enable it again
IFS=" "
echo "${array[0]}"
unset IFS