भागने के दृश्यों के साथ नियंत्रण वर्ण कैसे प्रिंट करें?


9

मैंने tput का उपयोग करके रंग लाल को परिभाषित किया है

red=$(tput setaf 1)

मेरे कार्यक्रम में चेतावनी को चित्रित करने के लिए। यह ठीक काम करता है:

printf '%sfail\n' "$red"
# prints 'fail' in red

लेकिन एक मौके पर मैं पलायन क्रम को प्रिंट करना चाहता हूं, जैसे कि, कुछ इस प्रकार है:

\ ई [31mfail

यह मैं कैसे करूंगा? मुझे पता है कि प्रिंटफ़ में एक %qझंडा है लेकिन यह दूसरों के सामान से बच जाता है जो मैं नहीं चाहता।


क्या यह केवल ESC (0x1b) वर्ण है जिसे आप बदलना चाहते हैं \E, या अन्य नियंत्रण वर्ण?
स्टीफन चेजलस

जवाबों:


10

ऐसा लगता है कि आप उन्हें वास्तव में छापने के विपरीत चाहते हैं, आप चाहते हैं कि उन वर्णों को एक मुद्रण योग्य वर्णनात्मक रूप में परिवर्तित किया जाए जैसे , \Eया ...\033^[

यदि यह केवल ESC (0x1b) वर्ण है जिसे आप में बदलना चाहते हैं \E, तो ksh93, zshया bash(आम तौर पर, वही जो उस गैर-मानक का समर्थन करते हैं %q), आप कर सकते हैं:

printf '%s\n' "${red//$'\e'/\\E}"

या करने के लिए पाइप sed $'s/\e/\\\\E/g'

गैर-ग्राफ़िकल वर्णों को परिवर्तित करने में अधिक सामान्य दृष्टिकोण के लिए, आप इसका उपयोग कर सकते हैं:

$ printf %s "$red" | od -A n -vt c # POSIX
 033   [   3   1   m
$ printf %s "$red" | sed -n l # POSIX
\033[31m$
$ printf '%s\n' "${(qqqq)red}" # zsh
$'\033[31m'
$ printf '%s\n' "$red" | cat -vt # some cat implementations
^[[31m
$ printf %s "$red" | uconv -x ':: [:Cc:]; ::Hex;' # ICU tools
\u001B[31m
$ printf %s "$red" | uconv -x ':: [:Cc:]; ::Name;' # ICU tools
\N{<control-001B>}[31m

5

का प्रयोग करें od, hexdump, xxd, या मानव पठनीय रूप में बाइनरी डेटा मुद्रित करने के लिए इसी तरह की। उदाहरण के लिए:

$ tput setaf 1 | od -c
0000000 033   [   3   1   m
0000005

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.