回答:
末尾の空白を処理する必要がある場合は、awkが適切なオプションです。
echo " word1 word2 " | awk '{print $1;}' # Prints "word1"
ただし、Cutはこれを処理しません。
echo " word1 word2 " | cut -f 1 -d " " # Prints nothing/whitespace
スペースの前の最初のものが別のスペースだったので、ここで 'cut'は何も/空白を出力しません。
-F","
が、デフォルトのフィールド区切り文字(スペース)をコンマで上書きするために使用できます。
外部コマンドを使用する必要はありません。バッシュ自体がその仕事をすることができます。「word1 word2」がどこかから取得され、変数に格納されていると仮定します。
$ string="word1 word2"
$ set -- $string
$ echo $1
word1
$ echo $2
word2
これで、必要に応じて、$ 1や$ 2などを別の変数に割り当てることができます。
stdin
。@Matt M. --
はを意味するstdin
ため$string
、として渡されstdin
ます。stdin
引数に空白で分離され$1
、$2
、$3
、など-ちょうどバッシュプログラム評価する引数(例えば、チェックするときのように$1
、$2
など)は、このアプローチは分割するシェルの傾向を活用するstdin
ために必要がなくなり、自動的に引数にawk
かcut
。
set
、シェル引数を設定します。
word1=$(IFS=" " ; set -- $string ; echo $1)
単語間のスペースを正しく認識するようにIFSを設定します。元の$ 1の内容を壊さないように、括弧で囲みます。
string="*"
。驚き。
効率的な方法の1つは、bash配列を使用することです。
array=( $string ) # do not use quotes in order to allow word expansion
echo ${array[0]} # You can retrieve any word. Index runs from 0 to length-1
また、パイプラインで配列を直接読み取ることもできます。
echo "word1 word2" | while read -a array; do echo "${array[0]}" ; done
echo " word1 word2 " | { read -a array ; echo ${array[0]} ; }
string="*"
。驚き。
while
構文を使用して、各行の最初の単語をすべて取得します。それ以外の場合は、Boontawee Homeアプローチを使用します。また、echo "${array[0]}"
gniourf-gniourfによって通知されるように、拡張を防ぐために引用されていることに注意してください。
echo "word1 word2 word3" | { read first rest ; echo $first ; }
これには、外部コマンドを使用せず、$ 1、$ 2などの変数をそのまま残すという利点があります。
$1, $2, …
そのままにしておくことは、スクリプト作成に非常に役立つ機能です。
%% *
これは、シェルパラメータ展開を使用した別のソリューションです。最初の単語の後の複数のスペースを処理します。最初の単語の前のスペースを処理するには、さらに1つの拡張が必要です。
string='word1 word2'
echo ${string%% *}
word1
string='word1 word2 '
echo ${string%% *}
word1
%%
が意味削除の最長の可能なマッチ *
で(どの他の任意の数の文字に続く空間)末尾の一部string
。
速度の点で、上位の回答のいくつかがどのように評価されるのかと思いました。私は以下をテストしました:
1 @mattbh
echo "..." | awk '{print $1;}'
2 @ ghostdog74's
string="..."; set -- $string; echo $1
3 @ boontawee-home's
echo "..." | { read -a array ; echo ${array[0]} ; }
と4 @ boontawee-home's
echo "..." | { read first _ ; echo $first ; }
5文字の単語が215のテスト文字列を使用して、macOSのZsh端末のBashスクリプトでPythonのtimeitを使用して測定しました。各測定を5回行って(結果はすべて100ループであり、3つのうち最良)、結果を平均しました。
method time
--------------------------------
1. awk 9.2ms
2. set 11.6ms (1.26 * "1")
3. read -a 11.7ms (1.27 * "1")
4. read 13.6ms (1.48 * "1")
いい仕事、有権者👏投票(この記事の執筆時点で)はソリューションの速度と一致しています!
read -a
ダッシュでは無効)、ダッシュで3を測定できるのは奇妙です。
echo "word1 word2" | cut -f 1 -d " "
cutは、文字列 ""(-d "")で区切られたフィールドのリストから最初のフィールド(-f 1)を切り取ります
read
あなたの友だちです:
文字列が変数にある場合:
string="word1 word2"
read -r first _ <<< "$string"
printf '%s\n' "$first"
パイプで作業している場合:最初のケース:最初の行の最初の単語のみが必要です。
printf '%s\n' "word1 word2" "line2" | { read -r first _; printf '%s\n' "$first"; }
2番目のケース:各行の最初の単語が必要です。
printf '%s\n' "word1 word2" "worda wordb" | while read -r first _; do printf '%s\n' "$first"; done
これらは、先行スペースがある場合に機能します。
printf '%s\n' " word1 word2" | { read -r first _; printf '%s\n' "$first"; }
私は、perl、awk、またはpythonを含まない組み込みデバイスを使用していて、代わりにsedを使用していました。最初の単語の前の複数のスペースをサポートします(これはcut
およびbash
ソリューションでは処理されませんでした)。
VARIABLE=" first_word_with_spaces_before_and_after another_word "
echo $VARIABLE | sed 's/ *\([^ ]*\).*/\1/'
ps
ここでbashのみを使用する他のソリューションでps
は、位置合わせに使用する最初のスペースを削除できなかったため、これはプロセスIDのgreppingに非常に役立ちました。