Problema ao usar 'sed' para colorir a saída 'ls' (a décima referência anterior '\ 10' não está funcionando)

0

Eu fiz esta pergunta há algum tempo: É possível colorir a parte das permissões da saída de ls ?

Embora a resposta aceita nessa pergunta seja OK, agora quero fazer a mesma coisa sem usar nenhum idioma "externo". Eu criei o seguinte usando uma função bash e sed .

A questão é: você pode me ajudar a corrigir um bug e também me ajudar a tornar este código "melhor"?

  • Melhorar : estou repetindo \([r-]\)\([w-]\)\([x-]\)\ três vezes. Como tornar isso mais sucinto?
  • Corrigir bug : não consigo obter uma referência de retorno para a décima partida . O sed suporta apenas até 9 referências anteriores?



Aparterelevantedocódigo(divididoemváriaslinhasparafinsdemelhorlegibilidadeaopostarnestapergunta):

ls-la|sed"s
/^
\([d-]\)
\([r-]\)
\([w-]\)
\([x-]\)
\([r-]\)
\([w-]\)
\([x-]\)
\([r-]\)
\([w-]\)
\([x-]\)
/
'echo -e \"
$EMG
$EMY
$EMR
$EMC
$NONE\"'/"

Para referência, a função completa que estou usando é:

domagic() {
  local NONE="3[0m"    # unsets color to term's fg color

  # regular colors
  local K="3[0;30m"    # black
  local R="3[0;31m"    # red
  local G="3[0;32m"    # green
  local Y="3[0;33m"    # yellow
  local B="3[0;34m"    # blue
  local M="3[0;35m"    # magenta
  local C="3[0;36m"    # cyan
  local W="3[0;37m"    # white

  # emphasized (bolded) colors
  local EMK="3[1;30m"
  local EMR="3[1;31m"
  local EMG="3[1;32m"
  local EMY="3[1;33m"
  local EMB="3[1;34m"
  local EMM="3[1;35m"
  local EMC="3[1;36m"
  local EMW="3[1;37m"

  # background colors
  local BGK="3[40m"
  local BGR="3[41m"
  local BGG="3[42m"
  local BGY="3[43m"
  local BGB="3[44m"
  local BGM="3[45m"
  local BGC="3[46m"
  local BGW="3[47m"

  #do magic here
  ls -la | sed "s/^\([d-]\)\([r-]\)\([w-]\)\([x-]\)\([r-]\)\([w-]\)\([x-]\)\([r-]\)\([w-]\)\([x-]\)/'echo -e \"$EMG$EMY$EMR$EMC$NONE\"'/"
}
domagic
#to run: save as domagic.sh and run with: bash domagic.sh
    
por Zabba 23.10.2011 / 21:27

2 respostas

3

Sed suporta até 9 referências anteriores, mas observando que \ 2 \ 3 \ 4 sempre estão juntos, assim como \ 5 \ 6 \ 7 e \ 8 \ 9 \ 10, você pode usar apenas quatro grupos, como nos seguintes :

"s/^\([d-]\)\([r-][w-][x-]\)\([r-][w-][x-]\)\([r-][w-][x-]\)/'echo -e \"$EMG$EMY$EMR$EMC$NONE\"'/""
    
por enzotib 23.10.2011 / 22:15
0

Você está chamando sed de bash para poder usar o bash para evitar a repetição das classes de caracteres. Tudo dentro de aspas duplas é expandido:

rwx='\([r-]\)\([w-]\)\([x-]\)'
ls -la | sed "s/^\([d-]\)$rwx$rwx$rwx/'echo -e \"$EMG$EMY$EMR$EMC$NONE\"'/"

Mas não acho que procurar drwx esteja correto. E se o arquivo for um link simbólico? Isso começará com l . E se for um diretório "fixo" (por exemplo, /tmp ), isso terminará com t em vez de x , etc.

Por que não apenas

ls -la | sed "s/^\(.\)\(...\)\(...\)\(...\)/'echo -e \"$EMG$EMY$EMR$EMC$NONE\"'/""

Por fim, se você alterar a forma de declarar suas cores, não precisará do echo -e :

domagic() {
  local NONE=$'3[0m'    # unsets color to term's fg color

  # regular colors
  local K=$'3[0;30m'    # black
  local R=$'3[0;31m'    # red
  local G=$'3[0;32m'    # green
  local Y=$'3[0;33m'    # yellow
  local B=$'3[0;34m'    # blue
  local M=$'3[0;35m'    # magenta
  local C=$'3[0;36m'    # cyan
  local W=$'3[0;37m'    # white

  # emphasized (bolded) colors
  local EMK=$'3[1;30m'
  local EMR=$'3[1;31m'
  local EMG=$'3[1;32m'
  local EMY=$'3[1;33m'
  local EMB=$'3[1;34m'
  local EMM=$'3[1;35m'
  local EMC=$'3[1;36m'
  local EMW=$'3[1;37m'

  # background colors
  local BGK=$'3[40m'
  local BGR=$'3[41m'
  local BGG=$'3[42m'
  local BGY=$'3[43m'
  local BGB=$'3[44m'
  local BGM=$'3[45m'
  local BGC=$'3[46m'
  local BGW=$'3[47m'

  #do magic here
  ls -la | sed "s/^\(.\)\(...\)\(...\)\(...\)/$EMG$EMY$EMR$EMC$NONE/"
}
    
por Mikel 01.06.2012 / 21:15