Use sed para adicionar um espaço antes de cada linha que começa com um ponto, compatível com as cores do terminal

0

Exemplo de texto colorido (produzido a partir de ls):

\e[0m\e[01;34m.cache\e[0m/
\e[01;34minferno\e[0m/
\e[01;34m.JUNK\e[0m/
\e[01;34m.nano\e[0m/
\e[01;34mpoo\e[0m/
\e[01;34mPrograms\e[0m/
\e[01;34mrestore\e[0m/
\e[01;34m.ssh\e[0m/
\e[34;42mWorkspace\e[0m/
a.sh
.bash_history
\e[01;32m.bash_profile\e[0m*
.bashrc
gg dd.txt

comando Sed que não funciona:

sed -r 's/^((\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[mGK])*[^\.])/ /'

Estou tentando fazer isso fazendo eco de uma variável contendo o texto e inserindo-a no sed, assim:

 echo "$text" | sed -r 's/^((\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[mGK])*[^\.])/ /'

Eu só quero qualquer linha que não comece com um período para ter um espaço único antes disso. Passei horas nisso, por favor ajude.

    
por John Bradley 10.01.2017 / 06:52

1 resposta

0

I just want any line that does not start with a period to have a single space prepended before it.

Atualizar conforme este comentário:

It should ignore colors. \e[01;34m.nano\e[0m/ should not have a space in front of it

Experimente este sed :

sed -E '/^\.|\e/! s/(.)/ /'

Exemplo:

echo "\e[0m\e[01;34m.cache\e[0m/
\e[01;34minferno\e[0m/
\e[01;34m.JUNK\e[0m/
\e[01;34m.nano\e[0m/
\e[01;34mpoo\e[0m/
\e[01;34mPrograms\e[0m/
\e[01;34mrestore\e[0m/
\e[01;34m.ssh\e[0m/
\e[34;42mWorkspace\e[0m/
a.sh
.bash_history
\e[01;32m.bash_profile\e[0m*
.bashrc
gg dd.txt" | sed -E '/^\.|\e/! s/(.)/ /'
\e[0m\e[01;34m.cache\e[0m/
\e[01;34minferno\e[0m/
\e[01;34m.JUNK\e[0m/
\e[01;34m.nano\e[0m/
\e[01;34mpoo\e[0m/
\e[01;34mPrograms\e[0m/
\e[01;34mrestore\e[0m/
\e[01;34m.ssh\e[0m/
\e[34;42mWorkspace\e[0m/
 a.sh
.bash_history
\e[01;32m.bash_profile\e[0m*
.bashrc
 gg dd.txt

Apenas as linhas que não não começam com um ponto ( . ), OU começa com uma "cor" ( \e ) tem um caractere de espaço na frente.

    
por 10.01.2017 / 08:37