我有一个字符串从文件中读取,格式为“名 姓”。 我想将该字符串拆分并放入两个单独的变量$first
和$last
中。最简单的方法是什么?
read函数本身就可以完成分割,例如:
read first last < name.txt
echo "$first"
echo "$last"
扩展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
cut 命令可以将字符串按照指定字符分割成多个部分:
first=$(echo $str | cut -d " " -f 1)
last=$(echo $str | cut -d " " -f 2)
这可能不是最优雅的方式,但肯定很简单。
$first=`echo $line | sed -e 's/([^ ])+([^ ])+/\1/'`
$last=`echo $line | sed -e 's/([^ ])+([^ ])+/\2/'`
set - $variable; first=$1; last=$2
的命令进行提取。该命令会将变量分解为单独的单词,并将第一个和最后一个单词分别赋值给变量first
和last
。 - tripleee