2011-12-15 44 views

回答

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

不正確方法(並且不會工作) – Sorpigal 2011-12-15 12:03:38

+0

嗯......看起來我需要重新讀取我的unix工具書,它確實不起作用,我只是寫了我的記憶。對不起...... – LeleDumbo 2011-12-15 16:42:38

6

讀取可以進行分割,例如,

read first last < name.txt 

echo "$first" 
echo "$last" 
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 < file相當於cat file | readecho contents | read,但這種情況並非如此:在管道的讀命令在一個單獨的子shell運行,因此該值將丟失一旦read完成。爲了解決這個問題,你可以完成所有的操作在同一子shell變量:

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 
相關問題