Я пытаюсь создать массивы из строк, которые имеют разделитель ("|") в качестве разделителей и содержат пробелы.Некоторое время я оглядывался по сторонам, и благодаря источникам, таким как , я узнал, как разделить строку на разделителе в Bash? , Разделить строку на массив икуча больше.Я близко, но это не совсем работает.Две основные проблемы заключаются в том, что в строках есть пробелы, есть начальный и конечный разделители, а некоторые поля не заполнены.Кроме того, вместо того, чтобы просто отображать значения, мне нужно присвоить их переменным.Вот формат исходных данных:
|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:
Есть предложения?Спасибо !!
Решено: согласно первому предложению ниже, скрипт теперь выглядит так:
#!/bin/bash
userList=`cat userlist | sed 's/^|//; s/|$//; s/[ ]*|[ ]*/|/g;'`
oIFS="$IFS"; IFS=$'\n'
for line in $userList; do
IFS='|'
arr=($line)
echo "Username: ${arr[0]}"
echo "Full Name: ${arr[1]}"
echo "Phone 1: ${arr[2]}"
echo "Phone 2: ${arr[3]}"
#etc
done
IFS="$oIFS"
Вывод:
Username: jdoe
Full Name: John Doe
Phone 1: 555-1212
Phone 2:
Username: jdoe2
Full Name: Jane Doe
Phone 1: 555-1212
Phone 2:
Работает как шарм, большое спасибо!Я не пробовал другие предложения ниже, но в следующий раз мне нужно будет сделать что-то подобное.Спасибо всем!