এই sed
আদেশটি কীভাবে কাজ করে কেউ ব্যাখ্যা করতে পারে ?
sed 's@+@ @g;s@%@\\x@g' | xargs -0 printf "%b"
sed
এইভাবে নতুন কিছু শিখায় ! :)
এই sed
আদেশটি কীভাবে কাজ করে কেউ ব্যাখ্যা করতে পারে ?
sed 's@+@ @g;s@%@\\x@g' | xargs -0 printf "%b"
sed
এইভাবে নতুন কিছু শিখায় ! :)
উত্তর:
সেডে, বিকল্প কমান্ডগুলি সাধারণত হিসাবে লেখা হয় s/pattern/replacement/options
। তবে এটি ব্যবহার করার প্রয়োজন নেই /
- এটি সুবিধাজনক হলে আপনি অন্যান্য অক্ষর ব্যবহার করতে পারেন, তাই এটি হতে পারে s@pattern@replacement@options
বা s:foo:bar:g
। s@+@ @g
মত s/+/ /g
- +
স্থানগুলি দিয়ে সমস্ত প্রতিস্থাপন করুন । একইভাবে s@%@\\x@g
সমস্তকে প্রতিস্থাপন %
করে \x
(একক ব্যাকস্ল্যাশ সেডে একটি পালানোর চরিত্র, সুতরাং একটি আসল ব্যাকস্ল্যাশ পেতে আপনার দু'জনের প্রয়োজন)।
foo+%2Fbar
তারপরে একটি স্ট্রিং হয়ে যাবে foo \x2Fbar
। অবশেষে আপনাকে দেওয়ার printf "%b"
জন্য ব্যাকস্ল্যাশ-পালানো ক্রমগুলি \x2F
(ASCII চরিত্র যার হেক্সাডেসিমাল মান 2F, যা /
) প্রসারিত করবে foo /bar
।
আপনি ইউআরএলগুলি থেকে +
এস এবং %
সিকোয়েন্সগুলি ডিকোড করার জন্য যে কমান্ডটির বিষয়ে জিজ্ঞাসা করছেন তা কেবল একটি sed
আদেশ নয়, এটি একটি পাইপলাইন যা ইনপুট প্রসেস করে sed
, তারপরে xargs
আরও প্রক্রিয়াকরণের জন্য পাইপ করে eline প্রথমে sed
কমান্ডটি দেখুন:
sed 's@+@ @g;s@%@\\x@g'
আপনি এটি বিভাজক হিসাবে না /
বরং এটি দেখতে অভ্যস্ত @
হতে পারেন, যা কোনও জটিলতা ছাড়াই সহজেই এখানে করা যেতে পারে কারণ /
অনুসন্ধানের নিদর্শন বা প্রতিস্থাপন পাঠ্যগুলির কোনওটিতেই প্রদর্শিত হয় না। এই আদেশ সমতুল্য:
sed 's/+/ /g;s/%/\\x/g'
পছন্দ করুন /
, এর @
জন্য একেবারে ভাল বিরামচিহ্নের চরিত্র sed
।
ইনপুট প্রতিটি লাইন:
s@+@ @g
( s/+/ /g
) স্থানের সাথে বিকল্পগুলি ( s
) সংঘটন +
। এটি কেবল প্রথমটি নয়, +
একটি লাইনে সমস্ত এসকে প্রভাবিত করে g
।
;
ক্রিয়া ("কমান্ড") শেষ করে এবং আপনাকে একই "স্ক্রিপ্টে অন্য একটি নির্দিষ্ট করার অনুমতি দেয়" "
s@%@\\x@g
( s/%/\\x/g
) বিকল্পগুলি ( s
) এর %
সাথে সংঘটন \x
। আগের মতো, এটি প্রতিটি লাইনের ( g
) প্রথম মাত্রের চেয়ে সবার উপরে কাজ করে ।
ইন মাত্র এক প্রতিনিধিত্ব করে কারণ একটি বিশেষ অর্থ । এর বিশেষ অর্থটি হ'ল চরিত্র হিসাবে আপনি অন্য চরিত্রের বিশেষ অর্থটি ছিনিয়ে নেওয়ার জন্য ব্যবহার করেন যা এর পরে আসে যার অর্থ অন্যথায় থাকে। সুতরাং এটি হিসাবে পালাতে হবে ।\\x
\\
\
\
sed
\\
এখন আসুন একটি xargs
কমান্ড দেখুন, যার উদ্দেশ্য চালানো printf
।
xargs
কমান্ড লাইন তৈরি করে। আপনি যদি চালান , যেখানে এক বা একাধিক শব্দ রয়েছে, এর ইনপুট থেকে পড়া অতিরিক্ত কমান্ড-লাইন আর্গুমেন্টের সাথে চালায় । এই ক্ষেত্রে, পাইপ ( ) এর কারণে ইনপুটটি আউটপুট হয় । সাধারণত এর ইনপুটটিতে কোনও শ্বেত স্পেসের ব্যাখ্যা করে বোঝানো হয় যে পাঠ্যটির আগে এবং পরে পৃথক যুক্তি গঠন করে তবে বিকল্পটি পরিবর্তে নাল চরিত্রের উপস্থিতিতে যুক্তিগুলিকে বিভক্ত করে তোলে ।xargs command...
command...
xargs
command...
xargs
sed
|
xargs
-0
আপনার কমান্ডের উদ্দীষ্ট ব্যবহারের, একটি নাল অক্ষর প্রদর্শিত হবে না এবং xargs
চালানো হবে printf %b
মাত্র এক অতিরিক্ত কম্যান্ড-লাইন আর্গুমেন্ট, আউটপুট সঙ্গে sed
কমান্ড। সুতরাং, সাধারণ হিসাবে সমতুল্য না হলেও, এই ক্ষেত্রে পুরো পাইপলাইনটি পরিবর্তে কমান্ড সাবস্টিটিউশন ব্যবহার করে এভাবে লেখা হত xargs
:
printf '%b\n' "$(sed 's/+/ /g;s/%/\\x/g')"
এখানে কী printf
করার তাগিদে , যেমন মুড়ু বলেছেন যে %b
ফর্ম্যাট স্পেসিফায়ার একটি আর্গুমেন্ট গ্রহণ করে এবং মুদ্রণ করে (যেমন %s
) তবে ব্যাকস্ল্যাশ পালাতে পারে - sed
পাইপের বাম দিকের কমান্ডটি উত্পন্ন করতে লেখা হয়েছিল - অনুবাদ করার জন্য তারা উপস্থাপন অক্ষর মধ্যে ।
ধরুন আমি সেই কমান্ডটি চালিয়ে http://foldoc.org/debugging%20by%20printf
ইনপুট হিসাবে পাস করি । আমি http://foldoc.org/debugging by printf
আউটপুট হিসাবে পাই , কারণ %20
ক্রমগুলি স্থানগুলিতে অনুবাদ করা হয়েছে।
যে সৌন্দর্য sed
, এটা (যেমন কমান্ড করার পর নিজেই তার পারাদিগ্ম্স প্রযোজ্য ... s
বা tr
অথবা কিছুই), পরবর্তী অক্ষরে বিভাজক বিবেচনা করা হয়।
শেল এবং কমান্ড নিজেই হস্তক্ষেপ এড়াতে আপনার বুদ্ধিমানের সাথে নির্বাচন করা উচিত এবং জিনিসটিকে পাঠযোগ্য করে রাখুন তবে হররড হিসাবে কিছু লেখার পক্ষে এটি পুরোপুরি বৈধ:
echo 'arrival' | sed srarbrg
... এবং brrivbl
ফলস্বরূপ পান, যা আপনি প্রত্যাশা করেন। আপনি এটিকে সত্যই গুপ্ত করতে মজা করতে পারেন, যেমন:
echo 'arrival' | sed s\fa\fb\fg # \f is form feed, chr(12)
সাধারণ ব্যবহার হ'ল স্ল্যাশটিকে ডিলিমিটার হিসাবে ব্যবহার করা, তবে যখন আপনার অভিব্যক্তিটি সীমানারটি ধারণ করে তখন উদ্দেশ্যটি কী তা ধরা সহজতর করে তোলে। আপনার ডিলিমিটারটি ASCII8 পরিসরে যে কোনও কিছু হতে পারে (মাল্টিবাইট ডিলিটার যেমন £
ত্রুটি উত্সাহিত করে)।
কেবল লক্ষ্য রাখুন লক্ষ্যটি সহজতর করা, আরও ক্রিপ্টিক নয়।
sed "snack is an apple or something" <<< "I sed your snack is an apple or something"
sed
কমান্ডগুলি মস্তিষ্কের টিজার হিসাবেও ব্যবহার করতে পারেন , এটি কতটা বুদ্ধিমান?