Смотрит на меня, как будто необходимо выпустить команду запуска SCSI в этом состоянии. Возможно, включение Вашего SCSI-BIOS сделает тот прием - иногда существует опция на идентификатор SCSI для, "запускают единицу" да/нет.
структуры данных удара являются слишком элементарными даже для 2-мерных массивов. Вы уверены, что это - инструмент, который Вы хотите использовать?
С ударом и GNU grep, можно сделать эту неприятную путаницу:
line='{machineA=[0, 1024, 4, 1028], machineB=[1, 1025, 5, 1029]}'
declare -A "$(
echo "x=("
grep -oP '(\w+)(?==)|(?<==\[).*?(?=\])' <<< "$line" |
tr -d , |
paste - - |
sed 's/^/[/; s/\t/]="/; s/$/"/'
echo ")"
)"
for key in "${!x[@]}"; do # need quotes here
for element in ${x[$key]}; do # no quotes here
printf "%s\t%s\n" "$key" "$element"
done
done
machineA 0
machineA 1024
machineA 4
machineA 1028
machineB 1
machineB 1025
machineB 5
machineB 1029
Это довольно хрупко. Я использовал бы Perl для чего-то вроде этого: все еще ужасный, но более краткий
echo "$line" | perl -MData::Dumper -ne '
s/=\[/=>[/g;
eval "\$x=$_";
# do something with your data structure (a hash of arrays)
print Dumper($x)
'
$VAR1 = {
'machineB' => [
1,
1025,
5,
1029
],
'machineA' => [
0,
1024,
4,
1028
]
};
Утилиты обработки текста оболочки, прежде всего, разработаны для управления данными, представленными с одной записью на строку и полями, разделенными или пробелом или фиксированным символом. Этот формат полностью отличается, и Вы не сможете обработать его простым способом.
Один подход должен предварительно обработать файл для установки типу формата, который может быть обработан легко. Я предполагаю, что скобки и фигурные скобки не используются всегда кроме изображаемого здесь (фигурные скобки вокруг целого текста, скобки вокруг списков значения машины).
<data.txt sed -e 's/^{//' -e 's/}$//' -e 's/ *= *\[/,/g' -e 's/, */,/g' -e 's/\] *$//' -e 's/] *, */\n/g'
Результат имеет одну машину на строку и запятые для разделения записей. Следующий отрывок анализирует название машины на каждой строке и оставляет разделенный запятыми список внутри значений values
.
… | while IFS=, read -r machine values; do …
Следующий определенный для удара отрывок помещает значения в массив.
… | while IFS=, read -r -a values; do
machine=${values[0]}; shift values
echo "There are ${#values[@]} on machine $machine"
done
Можно использовать awk
выполнять задачу.
awk -F "], " '/[a-zA-Z]=\[[0-9]/ {gsub(/{|}/,""); for(i=1; i<=NF; i++) if($i !~ /\]$/) print $i"]"; else print $i}' data.txt
machineA=[0, 1024, 4, 1028]
machineB=[1, 1025, 5, 1029]
Это смотрит немного как JSON. Можно зафиксировать его, чтобы быть надлежащим JSON и инструментами JSON использования:
$ echo '{machineA=[0, 1024, 4, 1028], machineB=[1, 1025, 5, 1029]}' | perl -pe 's!\b!"!g; s/=/:/g' | json_pp
{
"machineB" : [
"1",
"1025",
"5",
"1029"
],
"machineA" : [
"0",
"1024",
"4",
"1028"
]
}
eval
, там. – Joseph R. 17.12.2013, 10:38