2492 some string continues here
これを変換したい
2492
バッシュで。どうすればいいですか?
これは近い感じですが、機能していません。
var="2492 some string continues here "
echo ${var%[[:space:]]*}
使いたいスペースが複数あるので
${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変数を変更していない場合は、先頭の空白が処理されます。
%%
(${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
区切り文字に基づいて文字列をカットするシンプルなツールcut
を使用することもできます。
echo "$mystring" | cut -d' ' -f 1
どこ :
-d' '
区切り文字をスペースに設定します-f 1
最初のフィールドを指定します(区切り文字に基づく)ネイティブのシェル文字列操作を使用できます。
TEST="test 1234 foo"
SPLIT_VAR=${TEST/ */ }
「*」に一致する最初のパターン(1つのスペースの次に何でも)を置き換え、「」(1つのスペース)に置き換えます。したがって、最初の単語と最初のスペースを保持します。
文字列操作のその他の使用法については、 http://www.tldp.org/LDP/abs/html/string-manipulation.html を参照してください。
ちなみに、これはあまり進化していないシェルでも動作します(busyboxのash実装でテスト済み)。
外部呼び出しを気にしない場合は、awkまたはsedを使用します。
$ string="first second third fourth"
$ echo "${string}" | awk '{print $1}' # will work even with tabs
first
$ echo "${string}" | sed -e "s/ .*$//" # will fail on leading whitespace
first
Bashおよび組み込みコマンドのみを使用するには、Internal Field Separator(IFS)およびarraysを使用できます。
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