如何在Bash中将字符串分割成两个变量?

4

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

4个回答

7

read函数本身就可以完成分割,例如:

read  first last < name.txt

echo "$first"
echo "$last"

3
如果你已经将它们存储在一个变量中,可以使用 set - $variable; first=$1; last=$2 的命令进行提取。该命令会将变量分解为单独的单词,并将第一个和最后一个单词分别赋值给变量 firstlast - tripleee

6

扩展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

cut 命令可以将字符串按照指定字符分割成多个部分:

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

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


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

1
嗯...看起来我需要重新阅读我的Unix工具书,它确实不起作用,我只是写下了我记忆中的内容。抱歉... - LeleDumbo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接