【发布时间】:2012-01-30 18:21:27
【问题描述】:
我正在尝试从以竖线 ("|") 作为分隔符并包含空格的字符串创建数组。我已经环顾了一段时间,感谢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:
有什么建议吗?谢谢!!
【问题讨论】:
-
这在 perl 或 ruby 中是微不足道的,有什么理由不使用其中之一?
-
我同意“使用 perl”的评论,但如果你想要一种仅限 bash 的方法,为什么不至少使用 'sed' 或其他东西来去除“|”前后的空格? "角色,至少让你自己更轻松
-
Perl 是一个选项,但我不熟悉它。我添加了一个 sed 行来删除前导/尾随分隔符和空格,更新问题。
-
@ennuikiller 这在 bash 中和在 perl 或 ruby 中一样微不足道。
-
@Martin 我可能会建议您尝试下面的 fgm 答案。恕我直言,这是最合适的答案。另外,看看我的 cmets 对他的回答也是如此。
标签: arrays string bash delimiter