इको-ई का उल्टा क्या है?


13

अगर मेरे पास गैर-अक्षर वाले अक्षर, नई लाइनें या टैब हैं, तो क्या कोई तरीका है जिससे मैं echoइस स्ट्रिंग को प्रिंट करने और इन वर्णों के लिए कोड दिखाने के लिए उपयोग कर सकता हूं (जैसे, \nनई लाइन के लिए, \bबैकस्पेस के लिए)?


2
आप प्रिंटफ़ कमांड का उपयोग कर सकते हैं, मैन प्रिंटफ़ देखें
फ़ारसीगुल्फ़

12
e- ohce*
रिमशॉट

3
printf '%q' "$str"बच गए स्ट्रिंग को प्रिंट करेगा। मैं इसे एक उत्तर के रूप में नहीं जोड़ रहा हूँ क्योंकि यह echo -eउपयोग करने से बचने का एक ही रूप नहीं है - बल्कि, यह स्पष्ट रूप से सुरक्षित होने का इरादा है - लेकिन (1) यह काफी अच्छा है यदि आपका लक्ष्य मानव पठनीयता है, (2) यदि आपका लक्ष्य सुरक्षित शेल पीढ़ी है, तो अच्छा है और (3) echo -eकिसी भी तरह बुराई और गलत है (यदि आप POSIX युक्ति पढ़ते हैं, तो आप देखेंगे कि printf स्ट्रिंग प्रारूपण करने का पसंदीदा तरीका है, और echo -eयह आधारभूत POSIX द्वारा गारंटी नहीं है। सब)।
चार्ल्स डफी

जवाबों:


7

ऐसा करने के कई तरीके हैं। सबसे पोर्टेबल दो जो मुझे पता हैं sedऔर od- वे दोनों पोसिक्स हैं।

printf '\n\r\b\t\033[01;31m' | sed -n l

यह पसंद है ... readशैली से बच जाता है - सी-शैली।

आउटपुट

$
\r\b\t\033[01;31m$

od थोड़ा और विन्यास योग्य है ...

printf '\n\r\b\t\033[01;31m' |
od -v -w12 -t c -t a -A n

 \n  \r  \b  \t 033   [   0   1   ;   3   1   m
 nl  cr  bs  ht esc   [   0   1   ;   3   1   m

यदि आप जानते हैं कि आप उन सभी विकल्पों में से क्या देख सकते हैं man od, लेकिन मैं निर्दिष्ट करता हूं कि मैं दो प्रकार के पलायन चाहता हूं - -t cबैकस्लैश पलायन और -t aनामित वर्ण। -wइसके बाद के संस्करण का इस्तेमाल किया विकल्प POSIX निर्धारित नहीं है।

और यहां एक छोटा शेल फ़ंक्शन है जो प्रत्येक बाइट के अष्टांगिक मूल्यों को अपने तर्कों में चित्रित करेगा - जो निश्चित odरूप से, साथ ही संभाल सकता है -t o:

proctal() (LC_ALL=C
    for a do while [ -n "$a" ] 
    do printf %o\\n "'$a"
    a=${a#?}; done; done)  

यह एक सरल है। यह थोड़ा और जटिल है। यह ऐसा करने में सक्षम होना चाहिए जो शेल-विशिष्ट printf -qकार्यान्वयन कर सकता है, हालांकि।

bsq() (set -f; export LC_ALL=C IFS=\'
    for a do q=${a##*\'}; printf \'
    [ -n "${a#"$q"}" ] &&
        printf "%s'\''" ${a%\'*}
    printf "%s'\n'''''\n" "$q"; done |
    sed -n "/'''''"'/!H;1h;//!d;$!n;x;l' |
    sed -e :n -e '/\\$/N;s/.\n//;tn
        s/\([^\\]\\\(\\\\\)*\)\([0-9]\)/\10\3/g
        s/\\\\'"''/\\\\''"'/g;s/$$//'
)

पहले से थोड़े अतिरिक्त के साथ उदाहरण स्ट्रिंग का उपयोग करना:

bsq "$(printf '\n\r\'\''b\t\033[01;31m')"

आउटपुट

'\n\r\\'\''b\t\0033[01;31m'

यह केवल थोड़ा अलग है। आप देख सकते हैं कि एक अतिरिक्त 0और एक अतिरिक्त \bअक्लैश है। यह एक readया एक %b printfतर्क के लिए आसान अनुवाद की अनुमति है। उदाहरण के लिए:

i=0
until [ $((i=$i+1)) -gt 5 ]
do touch "\%$i$(printf 'hey\b \t;\n\033 ')"
done   #just for ugly's sake

bsq * | eval "
    printf '<%b>\n' $(tr \\n \ )
" | tee /dev/fd/2 |
sed -n l

आउटपुट

<\%1he  ;
>
<\%2he  ;
>
<\%3he  ;
>
<\%4he  ;
>
<\%5he  ;
>
<\\%1hey\b \t;$
\033 >$
<\\%2hey\b \t;$
\033 >$
<\\%3hey\b \t;$
\033 >$
<\\%4hey\b \t;$
\033 >$
<\\%5hey\b \t;$
\033 >$

@ स्टीफनचेज़ेलैस यह अभी भी केवल सिंगल-बाइट चार्ज़ करेगा, लेकिन उम्मीद है कि अब इसके खराब होने की संभावना कम है।
mikeserv

1
मुझे आप 10k के निशान पर ले आइए :)
रमेश

वू हू!!!!!!!!!
स्लम

@ एसएलएम - मुझे लगता है कि .. तुम सच में पसंद है proctal?
मोकेसर

@ स्टीफनचेज़ेलस - क्या आपके पास कोई विचार है bsq()- क्या यह कुछ भी याद नहीं है? मैं पूछता हूं क्योंकि मैं बैकस्लैश के बारे में पूरी तरह आश्वस्त नहीं हूं।
मोकेसर

12

जब आप -eस्विच को echoअंदर bash, और प्रदान करने के लिए हटा देते हैं तो xpg_echoविकल्प सक्षम नहीं किया गया है, यह स्ट्रिंग्स को उनके मूल पाठ से अधिक कुछ नहीं के रूप में प्रिंट करना चाहिए। तो \nऔर \tशाब्दिक रूप में दिखाएगा।

उदाहरण

$ echo "hi\t\tbye\n\n"
hi\t\tbye\n\n

$ echo -e "hi\t\tbye\n\n"
hi      bye

आप printfबिल्ट-इन कमांड का उपयोग कर सकते हैं ksh93, zshया इसे ठीक भी कर सकते हैं bash

$ printf "%q\n" "$(echo -e "hi\t\tbye\n\nbye")"
$'hi\t\tbye\n\nbye'

( bashआउटपुट ऊपर दिखाया गया है। शेल के आधार पर कुछ भिन्नताएं हैं)।

अंश सेhelp printf मेंbash

%q शेल इनपुट के रूप में पुन: उपयोग किए जा सकने वाले तर्क को उद्धृत करें


1
यह नहीं है printf %qकि अनुगामी \nएस को छोटा किया जा रहा है , यह $()आउटपुट कैप्चर है जो उन्हें स्ट्रिप्स करता है।
परमानंद

@ecatmur - धन्यवाद मैंने लिखा है कि देर रात और आगे इसे डिबग करने की कोशिश नहीं की थी। आप सही होंगे, यह उपधारा है जो उन्हें अलग कर रहा है। : यहाँ एक कारण है unix.stackexchange.com/questions/17747/...
SLM

... किसी भी तरह, printfअपने आउटपुट को कैप्चर करने के लिए एक सबस्लेम के अंदर चल रहा है, मूर्खतापूर्ण है, क्योंकि printf -v varnameआउटपुट को सीधे एक चर में डाल देगा , इसमें कोई सबस्क्रिप्शन शामिल नहीं है।
चार्ल्स डफी

@CharlesDuffy - मैं आपको फॉलो नहीं कर रहा हूं, मैं printfएक सबशेल में नहीं चल रहा हूं, मैं एक में चल रहा था echo, विशुद्ध रूप से यह प्रदर्शित करने के लिए कि आप विशेष चरित्र आउटपुट से ले सकते हैं echoऔर इसे वापस बची हुई धारणा में परिवर्तित कर सकते हैं ।
स्लम

@ एसएलएम, यह पहली टिप्पणी की प्रतिक्रिया थी (ठीक है, जिस कोड ने पहली टिप्पणी का जवाब दिया था), कोड नहीं जैसा कि मैंने अभी पाया। यदि मुझे पूर्व संपादित स्थिति के बारे में कुछ गलत लगा, तो मेरी क्षमा याचना।
चार्ल्स डफी

5

आप कुछ का उपयोग कर सकते हैं,

$ cat filename
Ramesh is testing
New Line        is

अब, आप कुछ ऐसा कर सकते हैं,

$ cat -A filename

उत्पादन

Ramesh is testing$
New Line ^Iis $

किसी भी फाइल के बिना एक और सामान्य परीक्षण है,

$ echo Hello$'\t'world. | cat -A

उपरोक्त कमांड आउटपुट को निम्न प्रकार देता है,

Hello^Iworld.$

संदर्भ


4
या, बिल्ली के गैर-जीएनयू कार्यान्वयन में, उदाहरण के लिए, MacOS / X, अपनी बिल्ली को पशु चिकित्सक के पास ले जाएं ... cat -vet
tink

3

साथ zsh, देखते हैं (q), (qq), (qqq), (qqqq)चर विस्तार झंडे कि कर सकते हैं बोली विभिन्न तरीकों से चर:

$ a=$'a b\nba\bc\u00e9\0'

$ printf '%s\n' $a
a b
bcé

$ printf %s $a | od -vtc
0000000   a       b  \n   b   a  \b   c 303 251  \0
0000013

$ printf '%s\n' ${(q)a}
a\ b$'\n'ba$'\b'cé$'\0'

$ printf '%s\n' ${(qq)a}
'a b
bcé'

$ printf '%s\n' ${(qqq)a}
"a b
bcé"

$ printf '%s\n' ${(qqqq)a}
$'a b\nba\bcé\0'

$ (){local LC_ALL=C; print -r -- ${(qqqq)a}}
$'a b\nba\bc\303\251\0'

आपके मामले में, आप शायद अंतिम दो में से एक चाहते हैं।


1

od -cसामान्य वर्णों को सामान्य रूप से प्रिंट करेगा, लेकिन विशेष वर्ण (टैब, न्यूलाइन इत्यादि) और अनचाहे अक्षर उनके printfभागने के कोड के रूप में।

इसलिए:

$ echo -e asdf\\nghjk\\003foo | od -c -An
   a   s   d   f  \n   g   h   j   k 003   f   o   o  \n

-Anबताता है odउत्पादन नहीं पता करने के लिए।


-1

printfकमांड का उपयोग करें । उदाहरण के लिए:

printf "Hello\nthis is my line

उत्पादन होगा

Hello
this is my line

1
यह वैसा ही है echo -e, जैसा मैं उलटा खोज रहा हूं ।
डीआरएस

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