如何在bash中取一个字符串并将其拆分为2个变量?

时间:2011-12-15 06:40:49

标签: bash shell scripting

我有一个以“firstname lastname”格式从文件中读入的字符串。我想拆分该字符串并将其放入两个单独的变量$first$last。最简单的方法是什么?

4 个答案:

答案 0 :(得分:6)

read可以自行进行拆分,例如

read  first last < name.txt

echo "$first"
echo "$last"

答案 1 :(得分: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,但事实并非如此:管道中的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

答案 2 :(得分:1)

剪切可以将字符串拆分为由所选字符分隔的部分:

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

这可能不是最优雅的方式,但肯定很简单。

答案 3 :(得分:-1)

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