我有一个以“firstname lastname”格式从文件中读入的字符串。我想拆分该字符串并将其放入两个单独的变量$first
和$last
。最简单的方法是什么?
答案 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 | read
或echo 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/'`