Bash에서 첫 번째 공백 오른쪽에 있는 문자를 제거합니다.

Bash에서 첫 번째 공백 오른쪽에 있는 문자를 제거합니다.
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

관련 정보