web-dev-qa-db-ja.com

Bashの最初のスペースの右側の文字を削除します

2492  some string continues here

これを変換したい

2492

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

これは近い感じですが、機能していません。

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

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

${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変数を変更していない場合は、先頭の空白が処理されます。

14
glenn jackman

%%${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
Isaac

区切り文字に基づいて文字列をカットするシンプルなツールcutを使用することもできます。

echo "$mystring" | cut -d' ' -f 1 

どこ :

  • -d' '区切り文字をスペースに設定します
  • -f 1最初のフィールドを指定します(区切り文字に基づく)
2
Ikaros

ネイティブのシェル文字列操作を使用できます。

TEST="test  1234 foo"
SPLIT_VAR=${TEST/ */ }

「*」に一致する最初のパターン(1つのスペースの次に何でも)を置き換え、「」(1つのスペース)に置き換えます。したがって、最初の単語と最初のスペースを保持します。

文字列操作のその他の使用法については、 http://www.tldp.org/LDP/abs/html/string-manipulation.html を参照してください。

ちなみに、これはあまり進化していないシェルでも動作します(busyboxのash実装でテスト済み)。

1
Bear'sBeard

外部呼び出しを気にしない場合は、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
0

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
0
Robert Riedl