2013-06-29 2 views
2

저는 bash와 sed를 처음 접했습니다. who의 출력을 가져 와서 각 줄을 들여 쓰고 프로세스에서 사용자 이름을 채색하고 싶습니다. 다음은 지금까지 내가 가지고있는 것입니다 :bash 스크립트에서 sed 문자열을 이스케이프 처리합니다.

#!/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

두 가지 문제가 있습니다. 첫 번째는 귀하의 명령이 예상 한대로 작동하지 않는다는 것입니다. 먼저 수정하자. 나는 당신이 굵은 녹색으로 사용자를 쓰길 원하고, 나머지는 기본적으로 굵게 쓰지 않을 것이라고 생각한다. 더 좋을 것입니다 :

#!/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=$'\e[1m' 
unbold=$'\e[0m' 
green=$'\e[32m' 
default=$'\e[39m' 
who | sed "s/^\([[:alpha:]_]\+\)\(.*\)/$bold$green\1$default$unbold\2/" 

나 :

#!/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 가지 질문이있었습니다. 그 이유는 포스터 (2 명의 다른 남자)가 'PATH'라는 변수를 사용하여 모든 것을 망 쳤기 때문입니다. 그들은 이것을 존중해야만 시간을 절약 할 수있었습니다 : [tag : bash] _의 소문자 변수 이름 사용. –

관련 문제