2013-06-29 4 views
2

Я новичок в bash и sed. Я хотел бы сделать вывод who и вставить каждую строку, окрашивая имя пользователя в процессе. Вот что у меня есть до сих пор:Escaping sed строки в скрипте bash

#!/bin/bash 
BOLD="\e[1m" 
UNBOLD="\e[0m" 
GREEN="\e[32m" 
DEFAULT="\e[39m" 

who | sed "[email protected]\\([a-z_][a-z0-9_]{0,30}\\) \\(.*\\)@\\t$BOLD$GREEN\\1$DEFAULT$UNBOLD\\[email protected]" 

Сейчас он просто печатает выходные данные без каких-либо изменений. Я уверен, что проблема связана с побегом, но я не уверен, что ей нужно, а что нет.

Спасибо!

ответ

2

У вас есть две проблемы. Первый заключается в том, что ваша команда не делает то, что вы ожидаете. Давайте исправим это в первую очередь. Я предполагаю, что вы хотите написать пользователю жирным шрифтом, а остальные по умолчанию - unbold. Это должно быть лучше:

#!/bin/bash 
bold="\e[1m" 
unbold="\e[0m" 
green="\e[32m" 
default="\e[39m" 
who | sed "s/^\([[:alpha:]_]\+\)\(.*\)/$bold$green\1$default$unbold\2/" 

Или это действительно лучше? вы видите уродливые коды вместо приятных цветов. И это твоя вторая проблема. Это то, как мы будем это исправить:

#!/bin/bash 
bold=$'\e[1m' 
unbold=$'\e[0m' 
green=$'\e[32m' 
default=$'\e[39m' 
who | sed "s/^\([[:alpha:]_]\+\)\(.*\)/$bold$green\1$default$unbold\2/" 

или, если вам не нравится ANSI-C quotings:

#!/bin/bash 
bold=$(echo -e "\e[1m") 
unbold=$(echo -e "\e[0m") 
green=$(echo -e "\e[32m") 
default=$(echo -e "\e[39m") 
who | sed "s/^\([[:alpha:]_]\+\)\(.*\)/$bold$green\1$default$unbold\2/" 

Примечание. Считается очень плохой практикой использовать имена переменных в верхнем регистре в . Я знаю, что вы увидите много людей, которые это делают, но это действительно неправильно. Вот почему я опустил все ваши переменные.

+0

Что касается имен переменных: есть ли какая-то особая причина, это плохая практика? Учебное пособие, за которым я следую, похоже, использует прописные буквы для всех, предназначенных для постоянного и нижнего регистра для реальных переменных. – drwhattheheck

+1

@ drwhattheheck Между вчерашним днем ​​и этим утром здесь было два вопроса о том, как скрипт [tag: bash] не работает. Причина заключалась в том, что плакаты (2 разных парня) использовали переменную под названием «PATH» и, следовательно, все испортили. Они бы сэкономили часы, если бы они только уважали это: _use имена переменных нижнего регистра в [tag: bash] _. –

Смежные вопросы