Путь по умолчанию мог быть установлен в /etc/profile
как сказанный Joe, но также и в $HOME/.profile
. У меня также есть много пакетов, которые я скомпилировал самостоятельно (с общей процедурой ./configure --prefix=/opt/<name>
) установленный в /opt
. Выполнить двоичные файлы в /opt/<name>/bin
без любого дополнительного усилия я добавил
OPTDIR=/opt
for i in $OPTDIR/* ; do
BINDIR=$i/bin
if [ -d $BINDIR ] ; then
if [ -z $PATH ] ; then
PATH=$BINDIR
else
PATH=$BINDIR:$PATH
fi
fi
done
export PATH
к моему $HOME/.profile
который в Вашем случае был бы /etc/profile
. Теперь, даже если я устанавливаю пакеты под /opt
в будущем я не должен волноваться о доступе к связанным двоичным файлам в /opt/.*/bin
так как путь автоматически добавляется к $PATH
.
Поскольку дополнительное программное обеспечение не является необходимой конюшней, я предпочитаю $HOME/.profile
/etc/profile
.
Маленький комментарий: /etc/.profile
соответственно $HOME/profile
не выполняется Вашей оболочкой по умолчанию, но dash
. Легкий вариант bash
который уменьшает загрузку во время процесса начальной загрузки.
Ну, это не особенно изящно, но это сделает то, в чем Вы нуждаетесь. По крайней мере, это делает на примере, который Вы отправили:
perl -ne 'while(s/(\[(\d),\s*\[.+?\]\])//){push @{$k{$2}},$1 . ",";}
END{ print "[@{$k{$_}}]\n" for keys(%k)}' file.txt |
sed 's/,\]$/\]/' | sort
Выполнение команды выше на названном файле file.txt
это содержит строки от Вашего примера, дает следующий вывод:
[[0, [0, '1']], [0, [1, '5']], [0, [2, '9']]]
[[1, [0, '2']], [1, [1, '6']], [1, [2, '10']]]
[[2, [0, '3']], [2, [1, '7']], [2, [2, '11']]]
[[3, [0, '4']], [3, [1, '8']], [3, [2, '12']]]
Я не объясню подробно, так как это - на самом деле небольшая программа и использует довольно много функций Perl. Основная идея о сценарии Perl состоит в том, чтобы найти все случаи [\d, [.+?]]
где \d
любое число и .+?]]
все до первого ]]
. Это в основном соберет все различные подмассивы или кортежи или независимо от того, что они - и сохраняют их в хеше массивов, ключ которых является первой цифрой, та, на которой Вы хотите отсортировать. После того как целый файл был обработан, он распечатает каждый массив хеша. Это - вывод одного только сценария:
$ perl -ne 'while(s/(\[(\d),\s*\[.+?\]\])//){push @{$k{$2}},$1 . ",";}
END{ print "[@{$k{$_}}]\n" for keys(%k)}' file.txt
[[1, [0, '2']], [1, [1, '6']], [1, [2, '10']],]
[[3, [0, '4']], [3, [1, '8']], [3, [2, '12']],]
[[0, [0, '1']], [0, [1, '5']], [0, [2, '9']],]
[[2, [0, '3']], [2, [1, '7']], [2, [2, '11']],]
Я разделяю каждый массив sub с a ,
но это означает, что я получаю дополнительный в конце, таким образом, я использую sed
удалить это.
$ perl -ne 'while(s/(\[(\d),\s*\[.+?\]\])//){push @{$k{$2}},$1 . ",";}
> END{ print "[@{$k{$_}}]\n" for keys(%k)}' file.txt |
> sed 's/,\]$/\]/'
[[1, [0, '2']], [1, [1, '6']], [1, [2, '10']]]
[[3, [0, '4']], [3, [1, '8']], [3, [2, '12']]]
[[0, [0, '1']], [0, [1, '5']], [0, [2, '9']]]
[[2, [0, '3']], [2, [1, '7']], [2, [2, '11']]]
Наконец, Вы также хотели, это отсортировало, но так как они теперь организованы их первым символом, простым sort
сделаю:
$ perl -ne 'while(s/(\[(\d),\s*\[.+?\]\])//){push @{$k{$2}},$1 . ",";}
END{ print "[@{$k{$_}}]\n" for keys(%k)}' file.txt |
sed 's/,\]$/\]/' | sort
[[0, [0, '1']], [0, [1, '5']], [0, [2, '9']]]
[[1, [0, '2']], [1, [1, '6']], [1, [2, '10']]]
[[2, [0, '3']], [2, [1, '7']], [2, [2, '11']]]
[[3, [0, '4']], [3, [1, '8']], [3, [2, '12']]]