Как выполнить пользовательский вид

Путь по умолчанию мог быть установлен в /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 который уменьшает загрузку во время процесса начальной загрузки.

0
03.12.2013, 18:10
1 ответ

Ну, это не особенно изящно, но это сделает то, в чем Вы нуждаетесь. По крайней мере, это делает на примере, который Вы отправили:

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']]]
2
28.01.2020, 02:37
  • 1
    Мои глаза повреждают попытку 8-) –  slm♦ 03.12.2013, 19:12
  • 2
    @slm, снимающую Ваши стекла, выглядит лучше если не в :) –  terdon♦ 03.12.2013, 19:27

Теги

Похожие вопросы