প্রতিধ্বনির বিপরীতটি কী?


13

আমার যদি অ- echoপ্রিন্টেবল অক্ষর, নতুন লাইন বা ট্যাবগুলির সাথে স্ট্রিং থাকে তবে আমি এই স্ট্রিংটি মুদ্রণ করতে এবং এই অক্ষরগুলির (যেমন, \nনতুন লাইনের \bজন্য, ব্যাকস্পেসের জন্য) কোডগুলি দেখানোর জন্য কোন উপায় ব্যবহার করতে পারি ?


2
আপনি
প্রিন্টফ

12
e- ohce* রিমশট *
ডেভিড রিচার্বি

3
printf '%q' "$str"স্ট্রিং পলায়ন প্রিন্ট করবে। আমি এটিকে উত্তর হিসাবে যুক্ত করছি না কারণ এটি পলায়নের একই রূপ নয় যা echo -eব্যবহার করে - বরং এটি লক্ষ্য করা যায় যে এটি নিরাপদ-নিরাপদ হবে - তবে (1) আপনার লক্ষ্যটি যদি মানুষের পাঠযোগ্যতা হয় তবে এটি যথেষ্ট ভাল, (২) এটি আপনার লক্ষ্যটি যদি নিরাপদ শেল জেনারেশন হয় তবে তা যথেষ্ট ভাল এবং (3) echo -eএভিল অ্যান্ড ভুল যেভাবেই হয় (আপনি যদি পসিক্স স্পেকটি পড়েন তবে আপনি দেখতে পাবেন যে প্রিন্টফ স্ট্রিং ফর্ম্যাটিং করার পক্ষে পছন্দসই উপায়, এবং echo -eএখানে বেসলাইন পসিক্স দ্বারা গ্যারান্টিযুক্ত নয়) সব)।
চার্লস ডাফি

উত্তর:


7

এটি করার অনেকগুলি উপায় রয়েছে। সবচেয়ে পোর্টেবল দুই যে আমি জানি হয় sedএবং od- তারা উভয় POSIX করছি।

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 >$

@ StéphaneChazelas এটা করবে না এখনো শুধুমাত্র একক বাইট অক্ষর না, কিন্তু আশা করছি তার সম্ভাবনা কম এখন আপ ঘুর্ণি।
মাইকজার্ভ

1
আমাকে আপনাকে 10 কে মার্কে তুলতে দাও :)
রমেশ

সাব্বাস !!!!!!!!!
slm

@ এসএলএম - আমাকে অনুমান করতে দিন .. আপনি কি সত্যিই পছন্দ করেছেন 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 printfbash

%q আর্গুমেন্টটি এমনভাবে উদ্ধৃত করুন যা শেল ইনপুট হিসাবে পুনরায় ব্যবহার করা যেতে পারে


1
এটি printf %qযে পিছনের \nগুলি কেটে দিচ্ছে তা নয়, এটি $()আউটপুট ক্যাপচার যা তাদেরকে সরিয়ে দেয়।
ইকামত্মর

@ ক্যাটমুর - ধন্যবাদ আমি গভীর রাতে লিখেছিলাম এবং এটি আর ডিবাগ করার চেষ্টা করিনি। আপনি সঠিক হবেন, এটি তাদের বন্ধ করে দেওয়া সাবশেল। এখানে একটি কারণ কেন unix.stackexchange.com/questions/17747/...
SLM

... যাইহোক, printfএর আউটপুট ক্যাপচার করার জন্য একটি সাবশেলের অভ্যন্তরে দৌড়ানো নিখুঁত, যেহেতু printf -v varnameআউটপুটটিকে সরাসরি একটি ভেরিয়েবলের মধ্যে ফেলে দেবে, কোনও সাবস্কেল জড়িত নয়।
চার্লস ডাফি

@ চার্লসডুফি - আমি আপনাকে অনুসরণ করছি না, আমি printfএকটি সাবশেলে চালাচ্ছি না, আমি echoএকের মধ্যে দৌড়াচ্ছিলাম, নিখুঁতভাবে প্রদর্শন করার জন্য যে আপনি বিশেষ চরিত্রের আউটপুট নিতে পারেন echoএবং এটিকে পালিয়ে যাওয়া স্বরলিপিতে রূপান্তর করতে পারেন।
slm

@ এসএলএম, এটি প্রথম মন্তব্যের প্রতিক্রিয়া ছিল (ভাল, প্রথম মন্তব্যে যে কোডটি প্রতিক্রিয়া জানিয়েছিল), এখন যে কোডটি খুঁজে পেয়েছি তা নয়। যদি আমি পূর্বের সম্পাদনার স্থিতি সম্পর্কে কোনও ভুলের অনুমান করা হয় তবে আমার ক্ষমা চাই।
চার্লস ডাফি

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 এর / এক্স, এর চিকিত্সা ... আপনার বিড়াল নেওয়া বিড়াল -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, আমি বিপরীতটি খুঁজছি ।
drs

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