Bashで最初のスペースの右側にある文字を削除します。

Bashで最初のスペースの右側にある文字を削除します。
2492  some string continues here

に変換したいです。

2492

バッシュから。どうすればいいですか?

近いようですが動作しません。

var="2492  some string continues here  "
echo ${var%[[:space:]]*}

答え1

使いたいスペースが複数あるので

${var%%[[:space:]]*}
# ...^^

削除最長スペースで始まる末尾の部分文字列

単にスペースを使用すると、%文字列の最後のスペースであるゼロ文字以上の文字が続く最短スペースシーケンスを削除できます。

$ 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

関連情報