2016-06-07 1 views
3

나는 컬러 출력이 필요한 bash 스크립트를 작성 중이다. 나는이 화면에 인쇄 때 다음과 같은 포맷해야 텍스트 파일이 있습니다변수로부터 에코 프로세스 컬러 명령을 만들 수 있습니까?

>Barry's Whiskey Glass Drink Cup, XL 10 oz Dri...  $0.75 
example.org/product-page.php?id=1228741 

>Cotton Bath Towel Pool Towel Brown - Easy Car...  $6.11 
example.org/product-page.php?id=1228763 

>Cotton Bath Towel Pool Towel Red - Easy Care ...  $6.11  
example.org/product-page.php?id=1228766 

>Mosiso MacBook Case for iPad Pro 12.9/MacBook...  $1.95 
example.org/product-page.php?id=1228850 

'> ..... "텍스트가 하나 개의 색상, 할 필요를'$ ..."다른 색상 , "example.org ...."밝은 회색. 나는 이것을 시도 :

대신 코드를 처리, 라인별로 라인을 감동 때 파일에 올바른 이스케이프 코드를 삽입하지만,
tac newlist.txt | sed 's/ >/\r\n >/' > bwtext.txt 

    sed -i 's/>/>\\033\[0;34m/g' bwtext.txt 
    sed -i 's/\$/\$\\033\[0;33m/g' bwtext.txt 
    sed -i 's/http/\\033\[0;37mhttp/g' bwtext.txt 

    while read line 
    do 
     echo -e "${line}" 
    done < bwtext.txt 

, 그냥 그대로를 인쇄합니다.

>033[0;34mFor Fitbit Alta Accessory Band, Silicone Repl...  $033[0;33m1.97  
033[0;37mexample.org/product-page.php?id=1247364 

>033[0;34mTattify Gradient Nail Wraps - Love Like a Sun...  $033[0;33m0.99  
033[0;37mexample.org/product-page.php?id=1247367 

>033[0;34mEA AromaCare Eucalyptus Essential Oil 120ml/4...  $033[0;33m3.00  
033[0;37mexample.org/product-page.php?id=1247370 

... waiting 10 minutes for next update ... 

내가 뭘 잘못하고 있니? 감사.

답변

2

일반 텍스트 파일에 제어 문자를 삽입하고 싶지 않을 수 있습니다. [ exploits of a mom ]을 참조하십시오.
다음은 sed없이 문제를 해결하는 방법 중 하나 일 수 있습니다.

#Adding color to bash script output 
while read -r line # -r to prevent mangling of literal backslashes 
do 
    printf '%b\n' "${line/#>/\\e[1;34m>}" #using shell parameter expansion See Ref 2 
    #Also, you need two `\` make one `\` in the substitution 
    printf '%b\n' "\e[0;m" #resetting color to defaults, this is important 
done<your_actual_file 

참조

  1. 배쉬 : [ Using Colors ].
  2. 쉘 매개 변수 [ expansion ].
  3. POSIX 표준을 준수하는 일부 셸에서는 echo 즉 기본값이 echo -e입니다. bash에 대해서는이 점을 무시할 수 있습니다. 자세한 내용은 [ this ]을 확인하십시오. 어쨌든 echo -eprintf '%b\n'으로 대체했습니다.

참고 :이 대답은 완전히 당신의 요구 사항을 충족하지만, 당신에게 일을하는 다른 방법을 보여줍니다하지 않습니다.

+0

POSIX 호환 쉘에서 제대로 작동하려면'echo -e'보다는'printf '% b \ n''을 사용하십시오. (또한'xpg_echo'와'posix' 플래그가 설정되어 있어도 bash는'echo -e'를 따르지 않습니다). –

+0

또한 '-r 줄을 읽는 동안'으로 설정하면 리터럴 백 슬래시를 사용하지 않아 포맷 문자열에서 사용할 수 없습니다. –

+0

@CharlesDuffy : 의견 영광입니다. :-) – sjsam

2

파일에 올바른 이스케이프 시퀀스가 ​​있지만 while 루프에서 읽을 수 없습니다. 읽는 동안 원시 입력 플래그 (-r)를 추가하여 이스케이프 시퀀스를 해석하지 않고 원하는 형식을 지정하십시오.

while read -r line 
do 
echo -e "${line}" 
done < bwtext.txt 
+0

이것은 좋은 지적입니다. :-)하지만 그는 텍스트 파일에 이스케이프 시퀀스를 도입하지 않고도이 작업을 수행 할 수 있습니다. 또한 참조에 대한 링크를 추가 할 수도 있습니다. – sjsam

+0

'echo -e'는 실제로는 확장 기능이 아닌 POSIX와 반대입니다. 그러나'echo'가 명령 행에'-e'가 주어 졌을 때 출력에'-e'를 출력하는 것 이외의 일을하는 것은 표준 위임 된 행동에 위배됩니다. 결과적으로,'posix'와'xpg_echo' 플래그가 설정되면 bash는 이것을 멈추게됩니다. 표준을 따르는 대안은'printf '% b \ n ""$ line "'입니다. http://pubs.opengroup.org/onlinepubs/009604599/utilities/echo.html, 특히 APPLICATION USAGE 섹션을 참조하십시오. –

0

여기서 033을 볼 때 문자 그대로 이스케이프 문자가 있어야합니다. sed 및/또는 echo -e이이 작업을 수행 할 수는 있지만 이러한 특정 측면에 대해서는 표준화되지 않았으며 시스템에 대한 자세한 정보가 없으면 스크립트 수정 방법을 정확하게 알 수 없습니다. 그러나 Perl과 같이 합리적으로 표준화 된 도구로 이동할 수 있습니다.

perl -pe 's/ >/\r\n >/; 
    s/>/>\033[0;34m/g; 
    s/\$/\$\033[0;33m/g; 
    s/http/\033[0;37mhttp/g' newlist.txt 

덧붙여, 단지 펄처럼, 스크립트에서 여러 명령을 넣어 sed 지원합니다. 비록 당신이 그것을 할 수 없더라도, 명령을 파이프 라인에 넣는 것은 동일한 파일을 반복적으로 sed -i으로 다시 쓰는 것보다 훨씬 더 효율적입니다.

(또한 [은 대체 문자열의 일반 문자이며 백 슬래시 할 필요가 없습니다. 경기 부분에서 인수는 정규 표현식이며 여기서 [은 특별한 의미가 있습니다.다시 말해서 s/regex/string/에서 regexstring 부분은 약간 다른 구문이 적용됩니다.

0

여러분의 도움에 감사드립니다. 나중에 참조 할 수 있도록 에코 제안 대신에 -r 스위치와 printf를 모두 유지할 것입니다. 나는 또한 잘 작동했다 나는 다른 옵션에 공급 된 우분투 포럼이 게시했다 :

tac newlist.txt | sed 's/ >/\r\n >/' > reversed.txt 

sed $"s/\(>[^$]*\)\($.*\)/$DESC\1$COST\2/" reversed.txt | sed $"s/\(http.*\)/$LINK\1$CLR/" | sed $"s/\(FREE\)/$FREE\1$CLR/" 

가 다시 말하지만, 여러분 모두 감사합니다!

관련 문제