প্রচুর @ চিহ্ন সহ এই 'সেড' প্রতিস্থাপন আদেশটি কীভাবে কাজ করে?


8

এই sedআদেশটি কীভাবে কাজ করে কেউ ব্যাখ্যা করতে পারে ?

sed 's@+@ @g;s@%@\\x@g' | xargs -0 printf "%b"

3
এটি করার স্বাভাবিক উপায় হ'ল স্ল্যাশ ব্যবহার করা, তবে যদি আপনি কিছু স্ল্যাশ দিয়ে সন্ধান করে এবং প্রতিস্থাপন করেন তবে এটি জটিল হয়ে উঠতে পারে। এখানে বিষয়টি নয়, সুতরাং এটি পুরোপুরি ঠিকঠাক হলেও এটি আপনার মতো ভবিষ্যতের রক্ষণাবেক্ষণকে বিভ্রান্ত করে।
থরবজর্ন রাভন অ্যান্ডারসন

2
… এবং তাদের sedএইভাবে নতুন কিছু শিখায় ! :)
মিষ্টান্ন

উত্তর:


15

সেডে, বিকল্প কমান্ডগুলি সাধারণত হিসাবে লেখা হয় s/pattern/replacement/options। তবে এটি ব্যবহার করার প্রয়োজন নেই /- এটি সুবিধাজনক হলে আপনি অন্যান্য অক্ষর ব্যবহার করতে পারেন, তাই এটি হতে পারে s@pattern@replacement@optionsবা s:foo:bar:gs@+@ @gমত s/+/ /g- +স্থানগুলি দিয়ে সমস্ত প্রতিস্থাপন করুন । একইভাবে s@%@\\x@gসমস্তকে প্রতিস্থাপন %করে \x(একক ব্যাকস্ল্যাশ সেডে একটি পালানোর চরিত্র, সুতরাং একটি আসল ব্যাকস্ল্যাশ পেতে আপনার দু'জনের প্রয়োজন)।

foo+%2Fbarতারপরে একটি স্ট্রিং হয়ে যাবে foo \x2Fbar। অবশেষে আপনাকে দেওয়ার printf "%b"জন্য ব্যাকস্ল্যাশ-পালানো ক্রমগুলি \x2F(ASCII চরিত্র যার হেক্সাডেসিমাল মান 2F, যা /) প্রসারিত করবে foo /bar


2
সংক্ষেপে, একটি URL-> ফাইলের নাম ডিকোডার।
থরবজর্ন রাভন অ্যান্ডারসন

10

আপনি ইউআরএলগুলি থেকে +এস এবং %সিকোয়েন্সগুলি ডিকোড করার জন্য যে কমান্ডটির বিষয়ে জিজ্ঞাসা করছেন তা কেবল একটি sedআদেশ নয়, এটি একটি পাইপলাইন যা ইনপুট প্রসেস করে sed, তারপরে xargsআরও প্রক্রিয়াকরণের জন্য পাইপ করে eline প্রথমে sedকমান্ডটি দেখুন:

sed 's@+@ @g;s@%@\\x@g'

আপনি এটি বিভাজক হিসাবে না /বরং এটি দেখতে অভ্যস্ত @হতে পারেন, যা কোনও জটিলতা ছাড়াই সহজেই এখানে করা যেতে পারে কারণ /অনুসন্ধানের নিদর্শন বা প্রতিস্থাপন পাঠ্যগুলির কোনওটিতেই প্রদর্শিত হয় না। এই আদেশ সমতুল্য:

sed 's/+/ /g;s/%/\\x/g'

পছন্দ করুন /, এর @জন্য একেবারে ভাল বিরামচিহ্নের চরিত্র sed

ইনপুট প্রতিটি লাইন:

  1. s@+@ @g( s/+/ /g) স্থানের সাথে বিকল্পগুলি ( s) সংঘটন +। এটি কেবল প্রথমটি নয়, +একটি লাইনে সমস্ত এসকে প্রভাবিত করে g

  2. ; ক্রিয়া ("কমান্ড") শেষ করে এবং আপনাকে একই "স্ক্রিপ্টে অন্য একটি নির্দিষ্ট করার অনুমতি দেয়" "

  3. s@%@\\x@g( s/%/\\x/g) বিকল্পগুলি ( s) এর %সাথে সংঘটন \x। আগের মতো, এটি প্রতিটি লাইনের ( g) প্রথম মাত্রের চেয়ে সবার উপরে কাজ করে ।

    ইন মাত্র এক প্রতিনিধিত্ব করে কারণ একটি বিশেষ অর্থ । এর বিশেষ অর্থটি হ'ল চরিত্র হিসাবে আপনি অন্য চরিত্রের বিশেষ অর্থটি ছিনিয়ে নেওয়ার জন্য ব্যবহার করেন যা এর পরে আসে যার অর্থ অন্যথায় থাকে। সুতরাং এটি হিসাবে পালাতে হবে ।\\x\\\\sed\\


এখন আসুন একটি xargsকমান্ড দেখুন, যার উদ্দেশ্য চালানো printf

xargsকমান্ড লাইন তৈরি করে। আপনি যদি চালান , যেখানে এক বা একাধিক শব্দ রয়েছে, এর ইনপুট থেকে পড়া অতিরিক্ত কমান্ড-লাইন আর্গুমেন্টের সাথে চালায় । এই ক্ষেত্রে, পাইপ ( ) এর কারণে ইনপুটটি আউটপুট হয় । সাধারণত এর ইনপুটটিতে কোনও শ্বেত স্পেসের ব্যাখ্যা করে বোঝানো হয় যে পাঠ্যটির আগে এবং পরে পৃথক যুক্তি গঠন করে তবে বিকল্পটি পরিবর্তে নাল চরিত্রের উপস্থিতিতে যুক্তিগুলিকে বিভক্ত করে তোলে ।xargs command...command...xargscommand...xargssed|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ক্রমগুলি স্থানগুলিতে অনুবাদ করা হয়েছে।


3

যে সৌন্দর্য 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"
wjandrea

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