Câu hỏi Làm thế nào tôi có thể định dạng đầu ra từ một lệnh bí danh (`thời tiết EPWR`)?


Tôi đã tạo bí danh trong ~/.bashrc, thực thi weather EPWR cung cấp cho tôi thông tin thời tiết hiện tại ở dạng sau:

jjj:~$ do-I-need-a-jacket 
Searching via station...
[caching result Wroclaw Ii, Poland]
Current conditions at Wroclaw Ii, Poland (EPWR) 51-06N 016-53E 121M
   Last updated Nov 19, 2015 - 07:00 AM EST / 2015.11.19 1200 UTC
   Temperature: 53 F (12 C)
   Relative Humidity: 76%
   Wind: from the WNW (290 degrees) at 18 MPH (16 KT)
   Weather: Cumulonimbus clouds observed
   Sky conditions: partly cloudy

(cùng một văn bản dưới dạng ảnh chụp màn hình trên imgur.com hoặc là văn bản thuần túy trên pastebin.com)

Tôi cần thực hiện các bước nào để tùy chỉnh đầu ra này để nhiệt độ sẽ được đánh dấu màu đỏ và độ ẩm, ví dụ: màu xanh da trời? Ai đó có thể xây dựng?


3
2017-11-19 12:24


gốc


Tâm trí để đăng đầu ra như là văn bản cũng để chúng tôi có thể kiểm tra? - kos
Làm xong. Xin lỗi, tôi không nghĩ rằng nó sẽ hữu ích. - bowl
Không có vấn đề, có (một) vấn đề mặc dù, rõ ràng dòng từ "Nhiệt độ [...]" trở đi được thụt vào, những gì được sử dụng cho các ý định? Một bảng? Không gian? Bao nhiêu? - kos
Nếu đây là không gian, sau đó 3 tôi đoán. Tôi không có ý tưởng làm thế nào để kiểm tra nó. Plaintext trên pastebin? Làm xong. - bowl
@ kos 3 không gian tôi sẽ giả định. một tab có số lẻ lẻ: P - Rinzwind


Các câu trả lời:


Bạn có thể ống đầu ra của do-i-need-a-jacket với lệnh Perl này:

perl -ne 'if(/^(   Temperature: )(.*)/){print("$1\e[31m$2\e[0m\n")}elsif(/^(   Relative Humidity: )(.*)/){print("$1\e[34m$2\e[0m\n")}else{print}'

Mở rộng thành tập lệnh:

#!/usr/bin/perl

use strict;
use warnings;

-t STDIN && exit;

while(<STDIN>) {
    if(/^(   Temperature: )(.*)/) {
        print("$1\e[31m$2\e[0m\n")
    }
    elsif(/^(   Relative Humidity: )(.*)/) {
        print("$1\e[34m$2\e[0m\n")
    }
    else {
        print
    }
}

s1

Bạn có thể tô màu các dòng khác bằng các màu khác bằng cách thêm màu khác elsif khối sau if chặn và trước else khối (bạn sẽ phải thay đổi chuỗi để khớp và chuỗi thoát màu ANSI để phù hợp với màu mong muốn):

elsif (/ ^ ( Nhiệt độ:) (. *) /) {# Thay đổi điều này thành chuỗi để khớp ("Gió", "Thời tiết", "Điều kiện bầu trời", ...)
    in ("$ 1\ e [31 triệu$ 2 \ e [0m \ n ") # Thay đổi thành chuỗi màu ANSI để phù hợp với màu mong muốn
}

Danh sách các chuỗi thoát màu ANSI có thể có:

s2


1
2017-11-19 13:04



@bowl Tôi đã thử nghiệm tốt hơn :) công trình này: alias do-i-need-a-jacket='weather EPWR | perl -ne "if(/^( Temperature: )(.*)/){print(\"\$1\e[31m\$2\e[0m\n\")}elsif(/^( Relative Humidity: )(.*)/){print(\"\$1\e[34m\$2\e[0m\n\")}else{print}"' - kos
@bowl Xem ra rằng chuỗi các khoảng trắng được cắt thành một khoảng trống trong các chú thích, bạn sẽ phải thêm hai dấu cách trước "Nhiệt độ" và hai dấu cách trước "Độ ẩm tương đối" - kos
@bowl Đó là khá lạ. Các văn bản màu ở cấp thiết bị đầu cuối không nên ảnh hưởng đến điều này. Tâm trí để đăng bài của bạn ~/.bashrc nội dung (bao gồm bí danh không hoạt động) tại Ubuntu Pastebin? Rõ ràng là cảm thấy tự do để làm xáo trộn dữ liệu cá nhân nếu có. - kos
@bowl Ok, vấn đề là số lượng không gian; bạn cần chính xác ba dấu cách trước "Nhiệt độ" và ba dấu cách trước "Độ ẩm tương đối" (bạn hiện chỉ có hai dấu cách ~/.bashrc) và chính xác một khoảng trống giữa "Tương đối" và "Độ ẩm" (hiện tại bạn có hai ~/.bashrc), nó làm việc cho tôi ngay sau khi sửa chữa. Hãy cho tôi biết nếu lịch phát sóng này (nó nên mặc dù). - kos
@bowl Vui mừng vì nó đã giúp! Ngoài ra, hãy kiểm tra câu trả lời bên dưới, điều này rất hữu ích để tô màu đầu ra bằng cách sử dụng cụm từ thông dụng. - kos


Sử dụng "Kính màu Regex" từ Linux Hacks, dưới đây là hai cách:

# Colors the whole line
weather EPWR | rcg 'Temperature.*$' "RED" 'Relative Humidity.*' "BLUE"

hoặc là

# Color the values 
weather EPWR | rcg '\-?\d+ F \(\-?\d+ C\)' "RED" '\d+%' "BLUE"

Đây là lệnh cuối cùng tạo ra:

$ weather EPWR | rcg '\-?\d+ F \(\-?\d+ C\)' "RED" '\d+%' "BLUE"|od -bc
0000000 123 145 141 162 143 150 151 156 147 040 166 151 141 040 163 164
          S   e   a   r   c   h   i   n   g       v   i   a       s   t
0000020 141 164 151 157 156 056 056 056 012 133 143 141 143 150 151 156
          a   t   i   o   n   .   .   .  \n   [   c   a   c   h   i   n
0000040 147 040 162 145 163 165 154 164 040 127 162 157 143 154 141 167
          g       r   e   s   u   l   t       W   r   o   c   l   a   w
0000060 040 111 151 054 040 120 157 154 141 156 144 135 012 103 165 162
              I   i   ,       P   o   l   a   n   d   ]  \n   C   u   r
0000100 162 145 156 164 040 143 157 156 144 151 164 151 157 156 163 040
          r   e   n   t       c   o   n   d   i   t   i   o   n   s    
0000120 141 164 040 127 162 157 143 154 141 167 040 111 151 054 040 120
          a   t       W   r   o   c   l   a   w       I   i   ,       P
0000140 157 154 141 156 144 040 050 105 120 127 122 051 040 065 061 055
          o   l   a   n   d       (   E   P   W   R   )       5   1   -
0000160 060 066 116 040 060 061 066 055 065 063 105 040 061 062 061 115
          0   6   N       0   1   6   -   5   3   E       1   2   1   M
0000200 012 114 141 163 164 040 165 160 144 141 164 145 144 040 116 157
         \n   L   a   s   t       u   p   d   a   t   e   d       N   o
0000220 166 040 061 071 054 040 062 060 061 065 040 055 040 060 061 072
          v       1   9   ,       2   0   1   5       -       0   1   :
0000240 060 060 040 120 115 040 105 123 124 040 057 040 062 060 061 065
          0   0       P   M       E   S   T       /       2   0   1   5
0000260 056 061 061 056 061 071 040 061 070 060 060 040 125 124 103 012
          .   1   1   .   1   9       1   8   0   0       U   T   C  \n
0000300 040 040 040 124 145 155 160 145 162 141 164 165 162 145 072 040
                      T   e   m   p   e   r   a   t   u   r   e   :    
0000320 033 133 063 061 155 065 063 040 106 040 050 061 062 040 103 051
        033   [   3   1   m   5   3       F       (   1   2       C   )
0000340 033 133 060 155 012 040 040 040 122 145 154 141 164 151 166 145
        033   [   0   m  \n               R   e   l   a   t   i   v   e
0000360 040 110 165 155 151 144 151 164 171 072 040 033 133 063 064 155
              H   u   m   i   d   i   t   y   :     033   [   3   4   m
0000400 066 066 045 033 133 060 155 012 040 040 040 127 151 156 144 072
          6   6   % 033   [   0   m  \n               W   i   n   d   :
0000420 040 146 162 157 155 040 164 150 145 040 127 040 050 062 067 060
              f   r   o   m       t   h   e       W       (   2   7   0
0000440 040 144 145 147 162 145 145 163 051 040 141 164 040 061 062 040
              d   e   g   r   e   e   s   )       a   t       1   2    
0000460 115 120 110 040 050 061 060 040 113 124 051 012
          M   P   H       (   1   0       K   T   )  \n
0000474

Đừng phát minh lại bánh xe - hãy tìm một bánh xe để sao chép.


1
2017-11-19 18:23



Tôi chưa cài đặt Linux Hacks. Và tôi nghĩ tôi sẽ cố gắng làm điều đó trong Perl. - bowl
"Linux Hacks" là một cuốn sách, liên kết sẽ đưa bạn đến nguồn Perl cho rcg, một ví dụ từ cuốn sách. - waltinator
Không biết về kịch bản đó, khá tiện lợi. - kos