আপনি কীভাবে বাশ স্ক্রিপ্টের জন্য কিছু কীওয়ার্ড রঙিন করবেন?


10

আমি কিছু ইউনিট পরীক্ষা কোড চালাচ্ছি। ইউনিট পরীক্ষা কোড নিয়মিত পাঠ্য আউটপুট করে। এখানে অনেকগুলি পাঠ্য রয়েছে তাই আমি ব্যবহারকারীর গুরুত্বপূর্ণ কীওয়ার্ডগুলির জন্য হাইলাইট করতে চাই।

এই ক্ষেত্রে কীওয়ার্ডগুলি হ'ল "পাস" এবং "ব্যর্থ"।

আপনি কীভাবে "PASS" কে সবুজ হতে এবং "ব্যর্থ" লাল হতে চান?


আপনি কি পাস করেছেন এমন পরীক্ষাগুলির স্টাডাউট / স্টাডারকে দমন করা এবং ব্যর্থ পরীক্ষার জন্য কেবল স্টাডাউট / স্টার্ডার মুদ্রণ সম্পর্কে চিন্তা করেছেন? PHPUnit এটি করে, বা এটি করার জন্য কনফিগারযোগ্য। আমি খুঁজে পেয়েছি যে এই পদ্ধতিটি বেশ ভালভাবে কাজ করে, ওয়াইএমএমভি।
ক্লেটন স্ট্যানলি

উত্তর:


8

supercat আপনি যা সন্ধান করছেন তা মনে হচ্ছে

প্যাকেজ: সুপারক্যাট
বিবরণ-এন: প্রোগ্রাম যা টার্মিনাল এবং এইচটিএমএলের জন্য পাঠ্যকে রঙিন করে
 সুপারকার্যাট এমন একটি প্রোগ্রাম যা নিয়মিত মিলের ভিত্তিতে পাঠ্যকে রঙিন করে
 এক্সপ্রেশন / স্ট্রিং / অক্ষর। সুপারকেট এইচটিএমএল আউটপুটও সমর্থন করে
 স্ট্যান্ডার্ড ASCII পাঠ্য হিসাবে। কিছু পাঠ্য-বর্ণময় প্রোগ্রামের থেকে পৃথক
 বিদ্যমান, সুপারকার্টের জন্য আপনাকে প্রোগ্রামার হওয়ার দরকার নেই be
 বর্ণের বিধি তৈরি করুন।
হোমপেজ: http://supercat.nosredna.net/

কমান্ড লাইনে কী সংগ্রহ করবেন তা বলার কোনও উপায় নেই বলে মনে হচ্ছে, আপনাকে একটি কনফিগার ফাইল নির্দিষ্ট করতে হবে।

আমি মনে করি সেখানে 'ইলাইট' বা 'এইচএল' নামক একটি প্রোগ্রাম থাকত যা একটি প্যাটার্নের সাথে মেলে এমন পাঠ্যকে হাইলাইট করেছিল (যেমন grep --colour, তবে এটিও মিলছে না এমন লাইনগুলি প্রদর্শন করে), তবে আমি এটি অনুসন্ধান করতে গিয়ে খুঁজে পেলাম না।

পরিশেষে, জিএনইউ grepনিদর্শন হাইলাইট করতে ব্যবহার করা যেতে পারে - তবে কেবলমাত্র একটি রঙ ব্যবহার করা যেতে পারে (যেমন আপনার সবুজ রঙের পাস থাকতে পারে না এবং লাল রঙে ফলস, উভয়ই একই রঙের সাথে হাইলাইট করা হবে)।

এই জাতীয় কিছু মাধ্যমে আপনার ডেটা পাইপ করুন:

egrep --color "\b(PASS|FAIL)\b|$"

এই উদাহরণটিতে egrep (ওরফে grep -E) ব্যবহার করা হয় তবে -Gবেসিক রিজেক্সপ , -Fফিক্সড স্ট্রিং এবং -Pপিসিআরই কাজ করে।

সমস্ত ম্যাচ হাইলাইট করা হবে। ডিফল্ট লাল হয়, বা GREP_COLOR এনভ ভার্চ সেট করে।

এই কাজের মূল চাবিকাঠিটি হ'ল |$প্যাটার্নে ফাইনালটি শেষ-এর-লাইনের সাথে মেলে (যেমন সমস্ত লাইন মেলে) সুতরাং সমস্ত লাইন প্রদর্শিত হবে (তবে বর্ণযুক্ত নয়)।

\bশব্দ-সীমানা চিহ্নিতকারী যাতে এটি মিলে যায় যেমন ব্যর্থ কিন্তু ব্যর্থতা আছে। এগুলি প্রয়োজনীয় নয়, সুতরাং আপনি যদি আংশিক শব্দের সাথে মেলে করতে চান তবে সেগুলি সরিয়ে দিন।

আমি গতকাল লিখিত সুপারক্যাটটির জন্য উদাহরণের মোড়ক স্ক্রিপ্ট এখানে Here এটি কাজ করে, তবে এটি লেখার সময়, আমি আবিষ্কার করেছি যে সুপারক্যাটের কেস-সংবেদনশীল অনুসন্ধানের জন্য কোনও বিকল্প নেই। আইএমও, যা প্রোগ্রামটি উল্লেখযোগ্যভাবে কম দরকারী করে। এটি অবশ্য স্ক্রিপ্টটিকে খুব সরল করে দিয়েছে কারণ আমাকে '-i' বিকল্পটি লিখতে হয়নি :)

#! /bin/bash 

# Requires: tempfile from debian-utils, getopt from util-linux, and supercat

SCRIPTNAME=$(basename $0)
CFGFILE=$(tempfile -p spc)

usage() {
  cat <<__EOF__
Highlight regexp patterns found on stdin or files specified on command
line with specified colours.

Usage: $SCRIPTNAME [ --colour "pattern" ...] [FILE]

Options:

        -k,--black   regexp
        -r,--red     regexp
        -g,--green   regexp
        -y,--yellow  regexp
        -b,--blue    regexp
        -m,--magenta regexp
        -c,--cyan    regexp
        -w,--white   regexp

Example:

    run-script.sh | $SCRIPTNAME --green PASS --red FAIL

__EOF__
  exit 0
}


# Format definition from the spc man page:
#1234567890123456789012345678901234567890123456789012345
#HTML Color Name      Col A N T RE / String / Characters
FMT="%-20s %3s %1s %1s %1s (%s)\n"

add_color_to_config() {
  COLOR="$1"
  PATTERN="$2"

  printf "$FMT" "$COLOR" "$COLOR" - 0 r "$PATTERN" >> "$CFGFILE"
}


# uses the "getopt" program from util-linux, which supports long
# options. The "getopts" built-in to bash does not.
TEMP=$(getopt \
       -o 'hk:r:g:y:b:m:c:w:' \
       -l 'help,black:,red:,green:,yellow:,blue:,magenta:,cyan:,white:' \
       -n "$0" -- "$@")

if [ $? != 0 ] ; then echo "Terminating..." >&2 ; exit 1 ; fi

eval set -- "$TEMP"

while true ; do
    case "$1" in
        -k|--bla*)       add_color_to_config blk "$2" ; shift 2 ;;
        -r|--red)        add_color_to_config red "$2" ; shift 2 ;;
        -g|--gre*)       add_color_to_config grn "$2" ; shift 2 ;;
        -y|--yel*)       add_color_to_config yel "$2" ; shift 2 ;;
        -b|--blu*)       add_color_to_config blu "$2" ; shift 2 ;;
        -m|--mag*)       add_color_to_config mag "$2" ; shift 2 ;;
        -c|--cya*)       add_color_to_config cya "$2" ; shift 2 ;;
        -w|--whi*)       add_color_to_config whi "$2" ; shift 2 ;;

        -h|--hel*)       usage ; exit 0 ;;

        --)         shift ; break ;;

        *)          echo 'Unknown option!' ; exit 1 ;;
    esac
done

spc -R -c "$CFGFILE" "$@"
rm -f "$CFGFILE"

1
বিটিডাব্লু, আপনি যদি ব্যবহার করেন supercatআপনি কমান্ড-লাইন আর্টসের উপর ভিত্তি করে একটি অস্থায়ী কনফিগারেশন ফাইল তৈরি করতে পোস্ট করা স্ক্রিপ্টটি সংশোধন করতে পারেন, এবং তারপরে কল করতে পারেন spc -c /path/to/your/temp/config। এটি আপনাকে কমান্ড লাইনের বিভিন্ন প্যাটার্নের জন্য সহজেই বিভিন্ন রঙ নির্দিষ্ট করতে দেয়।
সি এ এস

এছাড়াও বিটিডব্লিউ, আমি এটি করার জন্য একটি সহজ মোড়ক স্ক্রিপ্ট লিখেছিলাম। আমাকে এখনই কাজ করতে যেতে হবে তবে আমি এটি পরিষ্কার করব, কিছু মন্তব্য ইত্যাদি যোগ করব এবং আজ পরে পোস্ট করব।
কাস

5

রেগেক্স প্যাটার্নগুলিকে রঙিন করার জন্য এখানে একটি সাধারণ-উদ্দেশ্য স্ক্রিপ্ট রয়েছে (সম্ভবত কিছু সংশোধন প্রয়োজন):

#! /bin/bash

color_to_num () {
  case $1 in
    black)  echo 0;;
    red)    echo 1;;
    green)  echo 2;;
    yellow) echo 3;;
    blue)   echo 4;;
    purple) echo 5;;
    cyan)   echo 6;;
    white)  echo 7;;
    *)      echo 0;;
  esac
}

# default values for foreground and background colors
bg=
fg=
bold="$(tput bold)"
italics=""
boundary=""

while getopts f:b:sli option; do
  case "$option" in
    f) fg="$OPTARG";;
    b) bg="$OPTARG";;
    s) bold="";;
    l) boundary=".*";;
    i) italics="$(tput sitm)";;
  esac
done

shift $(($OPTIND - 1))

pattern="$*"

if [ -n "$fg" ]; then
  fg=$(tput setaf $(color_to_num $fg))
fi
if [ -n "$bg" ]; then
  bg=$(tput setab $(color_to_num $bg))
fi

if [ -z "$fg$bg" ]; then
  fg=$(tput smso)
fi

sed "s/${boundary}${pattern}${boundary}/${bold}${italics}${fg}${bg}&$(tput sgr0)/g"

নাম দিন hilite.shএবং এটি এইভাবে ব্যবহার করুন:

$ ./BIN_PROGRAM | hilite.sh -f green PASS | hilite.sh -f red FAIL

$ # Here is an example one liner
$ echo -e "line 1: PASS\nline 2: FAIL" | hilite.sh -f green PASS | hilite.sh -f red FAIL

আমি এটি তৈরি করেছি community wikiকারণ আমার সমাধান কাজ করে না।
ট্রেভর বয়েড স্মিথ

পরীক্ষার একটি সহজ উপায় হ'ল অন্য স্ক্রিপ্ট তৈরি করা যা "পাস" এবং "ফেইল" কীওয়ার্ড সহ পাঠ্য প্রতিধ্বনি করে। এটি তখন এই স্ক্রিপ্ট দ্বারা ডাকা হবে।
ট্রেভর বয়ড স্মিথ

কিছুটা সামান্য বিষয়, তবে আমার উল্লেখ করতে হবে যে কমান্ড প্রতিস্থাপনের $BINমাধ্যমে আউটপুটকে পার্সিং evalকরা সম্ভবত ভঙ্গুর, জটিল এবং নিখুঁত বিপদজনক। STDOUT একটি স্ট্রিম এবং সাধারণত সরঞ্জামগুলির মতো স্ট্রিম দ্বারা প্রক্রিয়াজাতকরণ বোঝানো হয়। কোনও চলকটিতে একটি সম্পূর্ণ স্ট্রিম ক্যাপচার চেষ্টা করা খুব দক্ষ নয়। এছাড়াও, evalবিপজ্জনকভাবে শক্তিশালী , তাই যদি আপনি সত্যিই জানেন যে আপনি কী করছেন।
jw013

আমি স্ক্রিপ্টটি প্রতিস্থাপন করেছি একটি কাজের সাথে।
অ্যাঙ্গাস

@angus, সত্যিই দুর্দান্ত এবং চিত্তাকর্ষক স্ক্রিপ্ট আইএমও।
ট্রেভর বয়ড স্মিথ

3

প্রতিস্থাপনের এক্সপ্রেশনগুলিতে সালিশী স্ট্রিংগুলি ( tputআউটপুটের মতো ) এম্বেড করা sedসমস্যাযুক্ত কারণ আপনাকে নিশ্চিত করতে হবে (পলায়নের মাধ্যমে) স্ট্রিংটি বৈধ sedসিনট্যাক্স, যা আরও জটিলতা যা সেরা এড়ানো যায়। আমি awkপরিবর্তে ব্যবহার করতে হবে। যেমন একটি উদাহরণ:

{ echo line 1: PASS; echo line 2: FAIL; } | 
    awk -v "red=$(tput setaf 1)" -v "green=$(tput setaf 2)" \
        -v "reset=$(tput sgr0)" '
    { for (i = 1; i <= NF; i++) {
           if ($i == "FAIL") printf "%s", red "FAIL" reset;
           else if ($i == "PASS") printf "%s", green "PASS" reset;
           else printf "%s", $i

           if (i == NF) printf "%s", ORS
           else printf "%s", OFS 
      }}'

কীটি হ'ল বিকল্পগুলি ব্যবহার করে এখানে ভেরিয়েবলগুলিকে tputসিকোয়েন্সগুলি নির্ধারণ awkকরা -v


আমি আপনার প্রোগ্রামটি চালিয়েছি এবং এটি যা প্রয়োজন তা করে। Huzzah! তবে দুর্ভাগ্যক্রমে আমি একজন গুরু গুরু নই তাই কী চলছে তা বুঝতে আমার অসুবিধা হয়। আমি যেখানে ভুল সেখানে আমাকে সংশোধন করুন। প্রতিটি নতুন লাইনের জন্য কি বিদ্রূপ চালানো হয়? অ্যাজকে সোর্স কোডের লুপটি করছে: "লাইনের সমস্ত টোকেনের জন্য"? তাহলে এটি প্রতিটি টোকেন প্রক্রিয়া করে?
ট্রেভর বয়েড স্মিথ

আওক ক্ষেত্র এবং রেকর্ডের ক্ষেত্রে বিবেচনা করে। ডিফল্টরূপে, রেকর্ডগুলি পাঠ্যের লাইন এবং ক্ষেত্রগুলি শ্বেতস্থান নয়। একটি awkস্ক্রিপ্ট ব্লকের একটি সেট ( {}শীর্ষ স্তরের স্তরের মধ্যে স্টাফ ) নিয়ে গঠিত। প্রতিটি ব্লক একটি শর্তের সাথে যুক্ত - উপরের আমার পোস্টে কোনওটি নেই কারণ আমি প্রতিটি ইনপুট লাইনে নিঃশর্তভাবে কাজ করতে চাই। আওক ফাইল বা স্ট্যান্ডার্ড ইনপুট থেকে রেকর্ড পড়ার দ্বারা পরিচালিত হয় (এই ক্ষেত্রে এটি কোনও এসডিডিন বি / সি কোনও ফাইলের নাম সরবরাহ করা হয়নি), এবং প্রতিটি ব্লকের সাথে ক্রম মেলাতে, শর্তটি মিলে যদি রেকর্ডে ব্লকটি কার্যকর করে।
jw013

2

প্রিন্টফ ব্যবহার করুন:

printf "\e[%sm%s\e[00m\n" <some_number> <text_in_colour>

যেমন।

printf "\e[%sm%s\e[00m\n" 32 yodle

শেষটি \nনিউলাইন চরিত্রটি যুক্ত করে।

কিছু চেষ্টা করার সম্ভাব্য মানগুলি দেখতে:

for i in {0..9} {30..38} {90..98} {100..108};
do
    printf "%d:\e[%sm%s\e[00m\n" $i "$i" yodle;
done

রঙের পাশাপাশি আপনি সংখ্যার সমন্বয় করে গা bold় বা আন্ডারলাইন বা রঙিন ব্যাকগ্রাউন্ডের সাথে রঙিন পাঠ্যের মতো সংশোধনকারী যুক্ত করতে পারেন। ধূসর ব্যাকগ্রাউন্ড সহ নীল পাঠ্য তৈরি করতে যা ব্যবহারের মাধ্যমে নিম্নরেখাঙ্কিত এবং স্ট্রাইক করা হয়েছে:

printf "\e[%sm%s\e[00m\n" "4;9;34;107" yodle

চিয়ার্স,

/ B2S


2

আপনি যদি BASH স্ক্রিপ্টটি ইনস্টল করতে খুশি হন এবং ack, hhlighterপ্যাকেজের দরকারী ডিফল্ট রং এবং একটি সহজ ইন্টারফেস রয়েছে https://github.com/paoloantinori/hhighlitter :

হাই হাইলাইট উদাহরণ

এর সাথে শুরু হওয়া সারিগুলি হাইলাইট করতে আপনি এটি এর মতো ব্যবহার করতে পারেন FAIL:

h -i 'FAIL.*'

বা এতে রয়েছে FAIL:

h -i '.*FAIL.*'

বা বিভিন্ন সাধারণ লগ এন্ট্রি জন্য:

h -i '.*FAIL.*' '.*PASS.*' '.*WARN.*'

এবং অবশ্যই, প্লেইন গ্রেপ সহ একটি রঙের (লাল) জন্য:

$ printf 'Pass: good job\nFail: bad job\n' | grep -Ei --colour=auto '^|fail.*'

^প্রত্যেক লাইন মিলে যায়, কিন্তু কোনো বিশেষ মিলকারীর এবং সমগ্র লাইন ছাপে। হাইলাইট করা এক্সপ্রেশন একটি পরে সংজ্ঞায়িত করা হয় |। যতক্ষণ না তারা আলাদা হয় ততক্ষণ আরও প্রকাশ করা যায় |

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.