我正在尝试从以竖线(“|”)作为分隔符并包含空格的字符串创建数组。我已经四处寻找了一段时间,感谢像 How do I split a string on a delimiter in Bash? 这样的消息来源,我已经接近了。 , Splitting string into array还有更多。我很接近,但它不太管用。两个主要问题是字符串中有空格,有起止分隔符,还有一些字段是空白的。此外,我需要将它们分配给变量,而不是仅仅回显这些值。 这是源数据的格式:
|username|full name|phone1|phone2|date added|servers|comments|
例子:
|jdoe | John Doe| 555-1212 | |1/1/11 | workstation1, server1 | added by me |
这是我需要的:
Username: jdoe
Fullname: John Doe
Phone1: 555-1212
Phone2:
Date_added: 1/1/11
Servers: workstation1, server1
Comments: guest account
编辑:我使用 sed 去除第一个和最后一个定界符以及每个定界符前后的空格,现在输入:
jdoe|John Doe|555-1212||1/1/11|workstation1, server1|added by me
这是我尝试过的事情:
oIFS="$IFS"; IFS='|'
for line in `cat $userList`; do
arr=("$line")
echo "Username: ${arr[0]}" #not assigning a variable, just testing the output
echo "Full Name: ${arr[1]}"
echo "Phone 1: ${arr[2]}"
echo "Phone 2: ${arr[3]}"
# etc..
done
IFS="$oIFS"
输出:
Username:
Full Name:
Phone 1:
Phone 2:
Username: jdoe
Full Name:
Phone 1:
Phone 2:
Username: John Doe
Full Name:
Phone 1:
Phone 2:
我尝试的另一件事:
for line in `cat $userList`; do
arr=(${line//|/ })
echo "Username: ${arr[0]}"
echo "Full Name: ${arr[1]}"
echo "Phone 1: ${arr[2]}"
echo "Phone 2: ${arr[3]}"
# etc
done
输出:
Username: jdoe
Full Name: John
Phone 1:
Phone 2:
Username: Doe
Full Name: 555-1212
Phone 1:
Phone 2:
有什么建议吗?谢谢!!
最佳答案
您的第一次尝试非常接近。主要问题如下:
for line in `cat $userList`
按$IFS
拆分文件,而不是按换行符。所以你应该在循环之前设置IFS=$'\n'
,在循环内部设置IFS='|'
。 (顺便说一句,值得注意的是for ... in `cat ...`
方法读取整个文件然后将其拆分,所以如果文件可能很大。在这种情况下,基于read
的方法会更好。)arr=("$line")
,通过将$line
括在双引号中,防止分词,因此呈现$IFS
无关紧要。它应该只是arr=($line)
。- 由于
$line
有一个前导管道,您要么需要在到达arr=($line)
之前将其剥离(通过编写类似$line="${line#|}"
),否则您需要将arr
视为从 1 开始的数组(因为${arr[0]}
,第一个管道之前的部分将为空)。
把它放在一起,你会得到这样的东西:
oIFS="$IFS"
IFS=$'\n'
for line in `cat $userList`; do
IFS='|'
arr=($line)
echo "Username: ${arr[1]}" #not assigning a variable, just testing the output
echo "Full Name: ${arr[2]}"
echo "Phone 1: ${arr[3]}"
echo "Phone 2: ${arr[4]}"
# etc..
done
IFS="$oIFS"
(注意:我不担心字段的前导空格和尾随空格,因为“我可以单独执行该步骤”部分......还是我误解了?你也需要这部分的帮助吗?)
关于arrays - bash 字符串到带有空格和额外分隔符的数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8682996/