arrays - bash 字符串到带有空格和额外分隔符的数组

标签 arrays string bash delimiter

我正在尝试从以竖线(“|”)作为分隔符并包含空格的字符串创建数组。我已经四处寻找了一段时间,感谢像 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/

相关文章:

c++ - 我的动态数组有问题

string - 从 String 中删除单个尾随换行符而不进行克隆

javascript - 我怎样才能使这个 "percentage-only"Regex 工作?

linux - bash 脚本返回空的 ps 结果,CLI 上相同的一行正确返回

c++ - 在此初始化方法中将整个数组设置为 NULL 是 C++ 标准吗?

java - java中如何判断元素是否在数组中?

java - 函数删除数组类中的所有内容

string - Excel中删除除第一个单词之外的所有以特定字母开头的单词的第一个字符

bash - 如何在 bash 脚本中获取 "previous executed command"?

linux - bash 。可变的可见性和生命周期