Monday, April 29, 2024
 Popular · Latest · Hot · Upcoming
3
rated 0 times [  3] [ 0]  / answers: 1 / hits: 2485  / 2 Years ago, fri, june 3, 2022, 8:50:28

I had asked this question a while back: Is it possible to colorize permissions-part of the output of ls?


While the accepted answer in that question is OK, I now want to do the same thing without using any "external" language. I came up with the following using a bash function and sed.


The question is can you help me fix one bug and also help me make this code "better" ?



  • Make better: I am repeating ([r-])([w-])([x-]) three times. How to make this more succint?



  • Fix bug: I am unable to get a back-reference to the tenth match 10. Does sed only support up to 9 back-references?


    enter image description here







The relevant portion of the code (broken into multiple lines for purposes of better readability when posting in this question):


ls -la | sed "s
/^
([d-])
([r-])
([w-])
([x-])
([r-])
([w-])
([x-])
([r-])
([w-])
([x-])
/
`echo -e "
$EMG1
$EMY234
$EMR567
$EMC8910
$NONE"`/"

For reference, the complete function I am using is:


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 "$EMG1$EMY234$EMR567$EMC8910$NONE"`/"
}
domagic
#to run: save as domagic.sh and run with: bash domagic.sh

More From » bash

 Answers
3

Sed supports up to 9 backreferences, but observing that 234 go always together, as do 567 and 8910, you can use only four groups, like in the following:



"s/^([d-])([r-][w-][x-])([r-][w-][x-])([r-][w-][x-])/`echo -e "$EMG1$EMY2$EMR3$EMC4$NONE"`/""

[#42648] Friday, June 3, 2022, 2 Years  [reply] [flag answer]
Only authorized users can answer the question. Please sign in first, or register a free account.
nuehan

Total Points: 253
Total Questions: 109
Total Answers: 120

Location: Singapore
Member since Sat, Jul 25, 2020
4 Years ago
;