2011-12-15 10 views

答えて

-1
$first=`echo $line | sed -e 's/([^ ])+([^ ])+/\1/'` 
$last=`echo $line | sed -e 's/([^ ])+([^ ])+/\2/'` 
+0

ない権利アプローチ(と動作しません) – Sorpigal

+0

うーん...私は私のUNIXツールの本を再読み込みする必要があるように見えます、それは実際に動作しません、私はちょうど私の記憶にあるものを書いた。申し訳ありません... – LeleDumbo

6

読み出し分割自体を行うことができ、例えば

read first last < name.txt 

echo "$first" 
echo "$last" 
+3

また、変数に既に値がある場合は、 'set - $ variable;最初= $ 1;最後= $ 2 – tripleee

1

が選ばれた文字で区切られた部分に文字列を分割することができますカット:

first=$(echo $str | cut -d " " -f 1) 
last=$(echo $str | cut -d " " -f 2) 

それはおそらく最もエレガントな方法はありませんが、それは確かに簡単です。

5

FGMの答えを拡張し、あなたが改行文字で終了したトークンのいずれかの一部ではない単一の文字で区切られたトークンを含む文字列、およびを持っている時はいつでも、あなたは内部フィールドセパレータを使用することができます(IFS )とreadを分割します。いくつかの例:

echo 'John Doe' > name.txt 
IFS=' ' read first last < name.txt 
echo "$first" 
John 
echo "$last" 
Doe 

echo '+12 (0)12-345-678' > number.txt 
IFS=' -()' read -a numbers < number.txt 
for num in "${numbers[@]}" 
do 
    echo $num 
done 
+12 
0 
12 
345 
678 

典型的な間違いがread < filecat file | readまたはecho contents | readと等価であることを考えることですが、これはそうではありません:パイプ内のリードコマンドが別々のサブシェルで実行されるので、値が失われます一度readが完了します。

echo 'John Doe' | { read first last; echo $first; echo $last; } 
John 
Doe 

またはテキストが変数に格納されている場合、あなたはそれをリダイレクトすることができます:この問題を解決するには、同じサブシェル内の変数を持つすべての操作を行うことができますいずれか

name='John Doe' 
read first last <<< "$name" 
echo $first 
John 
echo $last 
Doe 
関連する問題