Проблема с помощью 'sed' к colorize 'ls' вывод (Десятая обратная ссылка '\10', не работающая)

Я задал этот вопрос некоторое время назад: действительно ли это возможно к colorize части полномочий вывода ls?

В то время как принятый ответ в том вопросе в порядке, я теперь хочу сделать то же самое, не используя "внешнего" языка. Я придумал следующее использование функции удара и sed.

Вопросом является банка, Вы помогаете мне исправить одну ошибку и также помочь мне сделать этот код "лучше"?

  • Сделайте лучше: Я повторяюсь \([r-]\)\([w-]\)\([x-]\)\ три раза. Как сделать это большим количеством succint?
  • Исправьте ошибку: Я не могу получить обратную ссылку на десятое соответствие \10. Делает sed только поддерживайте до 9 обратных ссылок?

    enter image description 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() {
  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
0
задан 13 April 2017 в 15:25

2 ответа

Вы звоните 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/"
}
0
ответ дан 13 April 2017 в 15:25

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\"`/""
0
ответ дан 13 April 2017 в 15:25

Другие вопросы по тегам:

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