Я задал этот вопрос некоторое время назад: действительно ли это возможно к colorize части полномочий вывода ls
?
В то время как принятый ответ в том вопросе в порядке, я теперь хочу сделать то же самое, не используя "внешнего" языка. Я придумал следующее использование функции удара и sed
.
Вопросом является банка, Вы помогаете мне исправить одну ошибку и также помочь мне сделать этот код "лучше"?
\([r-]\)\([w-]\)\([x-]\)\
три раза. Как сделать это большим количеством succint?Исправьте ошибку: Я не могу получить обратную ссылку на десятое соответствие \10
. Делает sed
только поддерживайте до 9 обратных ссылок?
Соответствующая часть кода (ворванный несколько строк в целях лучшей удобочитаемости при регистрации в этом вопросе):
ls -la | sed "s
/^
\([d-]\)
\([r-]\)
\([w-]\)
\([x-]\)
\([r-]\)
\([w-]\)
\([x-]\)
\([r-]\)
\([w-]\)
\([x-]\)
/
`echo -e \"
$EMG\1
$EMY\2\3\4
$EMR\5\6\7
$EMC\8\9\10
$NONE\"`/"
Для ссылки полная функция, которую я использую:
domagic() {
local NONE="\033[0m" # unsets color to term's fg color
# regular colors
local K="\033[0;30m" # black
local R="\033[0;31m" # red
local G="\033[0;32m" # green
local Y="\033[0;33m" # yellow
local B="\033[0;34m" # blue
local M="\033[0;35m" # magenta
local C="\033[0;36m" # cyan
local W="\033[0;37m" # white
# emphasized (bolded) colors
local EMK="\033[1;30m"
local EMR="\033[1;31m"
local EMG="\033[1;32m"
local EMY="\033[1;33m"
local EMB="\033[1;34m"
local EMM="\033[1;35m"
local EMC="\033[1;36m"
local EMW="\033[1;37m"
# background colors
local BGK="\033[40m"
local BGR="\033[41m"
local BGG="\033[42m"
local BGY="\033[43m"
local BGB="\033[44m"
local BGM="\033[45m"
local BGC="\033[46m"
local BGW="\033[47m"
#do magic here
ls -la | sed "s/^\([d-]\)\([r-]\)\([w-]\)\([x-]\)\([r-]\)\([w-]\)\([x-]\)\([r-]\)\([w-]\)\([x-]\)/`echo -e \"$EMG\1$EMY\2\3\4$EMR\5\6\7$EMC\8\9\10$NONE\"`/"
}
domagic
#to run: save as domagic.sh and run with: bash domagic.sh
Вы звоните sed
от bash
, таким образом, можно использовать удар, чтобы не повторять классы символов. Все в двойных кавычках расширено:
rwx='\([r-]\)\([w-]\)\([x-]\)'
ls -la | sed "s/^\([d-]\)$rwx$rwx$rwx/`echo -e \"$EMG\1$EMY\2\3\4$EMR\5\6\7$EMC\8\9\10$NONE\"`/"
Но я не думаю, ища drwx
совершенно правильно. Что, если файл является символьной ссылкой? Это запустится с l
. И если это - "липкий" каталог (например. /tmp
), это закончится t
вместо x
, и т.д.
Почему не просто
ls -la | sed "s/^\(.\)\(...\)\(...\)\(...\)/`echo -e \"$EMG\1$EMY\2$EMR\3$EMC\4$NONE\"`/""
Наконец, если Вы изменяетесь, как Вы объявляете свои цвета, Вам не нужно echo -e
:
domagic() {
local NONE=$'\033[0m' # unsets color to term's fg color
# regular colors
local K=$'\033[0;30m' # black
local R=$'\033[0;31m' # red
local G=$'\033[0;32m' # green
local Y=$'\033[0;33m' # yellow
local B=$'\033[0;34m' # blue
local M=$'\033[0;35m' # magenta
local C=$'\033[0;36m' # cyan
local W=$'\033[0;37m' # white
# emphasized (bolded) colors
local EMK=$'\033[1;30m'
local EMR=$'\033[1;31m'
local EMG=$'\033[1;32m'
local EMY=$'\033[1;33m'
local EMB=$'\033[1;34m'
local EMM=$'\033[1;35m'
local EMC=$'\033[1;36m'
local EMW=$'\033[1;37m'
# background colors
local BGK=$'\033[40m'
local BGR=$'\033[41m'
local BGG=$'\033[42m'
local BGY=$'\033[43m'
local BGB=$'\033[44m'
local BGM=$'\033[45m'
local BGC=$'\033[46m'
local BGW=$'\033[47m'
#do magic here
ls -la | sed "s/^\(.\)\(...\)\(...\)\(...\)/$EMG\1$EMY\2$EMR\3$EMC\4$NONE/"
}
Sed поддерживает до 9 обратных ссылок, но замечая, что \2\3\4 идут всегда вместе, также, как и \5\6\7 и \8\9\10, можно использовать только четыре группы, как в следующем:
"s/^\([d-]\)\([r-][w-][x-]\)\([r-][w-][x-]\)\([r-][w-][x-]\)/`echo -e \"$EMG\1$EMY\2$EMR\3$EMC\4$NONE\"`/""