সেড: যদি পাওয়া যায় তবে ভেরিয়েবল লাইন কীভাবে প্রতিস্থাপন করবেন বা যদি পাওয়া না যায় তবে ফাইলের শেষের দিকে সংযোজন করবেন?


1

সুতরাং আমার প্রশ্নটি একটি সম্পর্কিত প্রশ্নের ভিত্তিতে খুব বেশি ভিত্তিতে , তবে এর একটি মূল পার্থক্য রয়েছে।

দেওয়া উত্তরে:

sed '/^FOOBAR=/{h;s/=.*/=newvalue/};${x;/^$/{s//FOOBAR=newvalue/;H};x}' infile

আমি একটি প্রকরণ তৈরি করেছি যা FOOBARভেরিয়েবল তৈরির জন্য কাজ করে (যেমন প্রোগ্রামের নাম এবং তারপরে একটি লুপের জন্য প্রোগ্রাম এবং তাদের ইনস্টলেশন স্থিতির একটি তালিকা তৈরি করে)। এটি একটি বরং জড়িত প্রকল্পের জন্য আমি কিছু নতুন বৈশিষ্ট্য সহ রাসম্পবেরি পাই এর জন্য ড্রইল ইনস্টলেশনটি সহজ করার জন্য কাজ করছি , তবে এটি কীটগুলির আলাদা ক্যান যাতে আমি প্রবেশ করতে যাচ্ছি না।

sed -i '/^'"$FOOBAR"'=/{h;s/=.*/=newvalue/};${x;/^$/{s//'"FOOBAR"'=newvalue/;H};x}' infile

আমি এমন newvalueএকটি হতে চাই $variableযা স্ক্রিপ্টে পরিবর্তন আনতে পারে । আমি কীভাবে এই কাজটি করব তা ঠিক বুঝতে পারি না , কেবল ব্যবহার করে 'এবং "এটি সঠিকভাবে না করে। আমি কয়েক ঘন্টা ব্রাউজিং এবং টিউটোরিয়াল পড়ার চেষ্টা করেছি , তবে আমি কেবল যথেষ্ট বুঝতে পারি না এবং সেডের অভ্যন্তরীণ কাজগুলিতে খুব গভীরভাবে ডুব দিয়েছি। বেশিরভাগ সময়ে, এই পরিবর্তনশীল ভালো কিছু সহজ হবে: yes, no, অথবা error। তবে, আমি এটি ফোল্ডার এবং ফাইলের পথগুলি উপস্থাপন করতেও ব্যবহার করতে পারি ... সুতরাং আমি /এখানে বিকল্পগুলি সম্পর্কেও চিন্তিত । এমনকি যদি এটির পুরো উত্তর না হয় তবে আমি এটিকে আরও ভালভাবে বুঝতে যেদিকে যেতে হবে সেদিকে ইঙ্গিত পেতে পারলে আমি নিজেকে এটি খুঁজে বের করতে পেরে খুশি।


সম্পাদনা: পোস্ট করার মতো অনেক কিছুই নেই যে আমি নিশ্চিত যে আমি নিখোঁজ রয়েছি সেখানে মৌলিক কিছু রয়েছে, আমি কেবলমাত্র নতুন মূল্যবোধের আশেপাশে উদ্ধৃতি দেওয়ার বিভিন্নতার চেষ্টা করেছি। যেমন নীচে ...

sed -i '/^FOOBAR=/{h;s/=.*/=$newvalue/};${x;/^$/{s//FOOBAR=$newvalue/;H};x}' infile

আউটপুট: FOOBAR = $newvalue
এটি ভুল। আউটপুট করা উচিত জন্য সঞ্চিত মান newvalue!

sed -i '/^FOOBAR=/{h;s/=.*/="$newvalue"/};${x;/^$/{s//FOOBAR="$newvalue"/;H};x}' infile

আউটপুট: FOOBAR = "$newvalue"
এটি ভুল। আউটপুট করা উচিত জন্য সঞ্চিত মান newvalue!

sed -i '/^FOOBAR=/{h;s/=.*/='"$newvalue"'/};${x;/^$/{s//FOOBAR='"$newvalue"'/;H};x}' infile

আউটপুট: sed: -e expression #1, char 30: unknown option to `s'

যদি newvalueএর সমান হয় Yes, তবে আমি আউটপুটটি FOOBAR = Yesবা সম্ভবত একটি ফোল্ডার পাথ চাই।


এটা কি আছে sed? এটি পার্ল বা অজানা, বা এমনকি যত্ন সহকারে সম্মিলিত শেল বিল্টিনগুলির সাহায্যে আরও সহজ হবে।
মাধ্যাকর্ষণ

1
'"$newvalue"'আমি মনে করি, বৈকল্পিকের সাথে কাজ করা উচিত, যদি না যুক্তি $newvalueপরিবর্তন হয় sed। উদাহরণস্বরূপ যদি এটি থাকে /তবে এর জন্য ডিলিমিটার হিসাবে অন্য একটি চরিত্র চয়ন করুন sedsed 's/a/b/'হতে পারে sed 's|a|b|'বা এমনকি হতে পারে sed 'sRaRbR'। এমন একটি চরিত্র চয়ন করুন যা সংঘটিত না হয় $newvalue
কামিল ম্যাকিয়েরোভস্কি

আমি আপনাকে যে রূপটি দেয় তা নিয়ে কথা বলছি unknown option to 's'। এটি $newvalueধারণ করে না এমনটি দিয়ে চেষ্টা করুন /
কামিল ম্যাকিয়েরোভস্কি

একক- এবং ডাবল-কোটগুলির মিশ্রণের পরিবর্তে, আমি কেবলমাত্র ডাবল-কোট দিয়ে আসল প্রতিস্থাপনটি ব্যবহার করা সহজ এবং পরামর্শ ( \$লাইন / শেষ রেখার রেফারেন্সের শেষ): এড়িয়ে চলা পরামর্শ দেব sed "/^$FOOBAR=/{h;s/=.*/=$newvalue/};\${x;/^\$/{s//$FOOBAR=$newvalue/;H};x}"। কিন্তু @ উপর KamilMaciorowski এর মন্তব্য মনে রাখবেন /মধ্যে $newvalue, আপনি DELIMITER পরিবর্তন করার প্রয়োজন হতে পারে যে যার মানে।
এএফএইচ

যদি আপনি ঠিকানায় অন্য সীমানা ব্যবহার করেন তবে আপনাকে অবশ্যই প্রথমটিটি এড়িয়ে চলতে হবে sed \|^FOOBAR=|...etc। ইন sকমান্ড পালাবার প্রয়োজন হয় না।
পাওলো

উত্তর:


1

এর মূল ফর্মটি দেখুন sed

ব্যবহার: sed [OPTION]... {script-only-if-no-other-script} [input-file]...

আমি এখানে পৌঁছেছি উত্তর এখানে।

sed -i '\!^'"$FOOBAR"'=!{h;s!=.*!='"$newvalue"'!};${x;\!^$!{s!!'"$FOOBAR"'='"$newvalue"'!;H};x}' /home/pi/Public/test.txt

বাম থেকে ডানে ব্যাখ্যা:

  • -i ফাইলটি জায়গায় জায়গায় সম্পাদনা করতে ব্যবহৃত হয়, যার অর্থ আসল ফাইলটি ব্যাকআপ ব্যতীত সম্পাদিত হয়।
  • ' অভিব্যক্তি স্ক্রিপ্ট শুরু করতে ব্যবহার করা হয় যা আমরা আমাদের লক্ষ্য অর্জনের জন্য ব্যবহার করব।
  • !সাধারণ /ডিলিমিটারের জায়গায় অবশ্যই ব্যবহার করা উচিত , যেহেতু আমরা ইনপুটটি প্রত্যাশা করছি যা /কোনও ফোল্ডার বা ফাইলের পাতায় ব্যবহার করতে পারে । এটি সঠিকভাবে ব্যাখ্যা করা হয়েছে তা নিশ্চিত করার জন্য প্রথম বিস্ময়কর চিহ্নটি পালিয়ে যায়
  • এই প্রথম অংশটি যা আছে তার বিদ্যমান অনুলিপি $FOOBARযেমন apache2আমাদের প্রোগ্রাম ইনস্টলেশন স্থিতির জন্য অনুসন্ধান করে। যে বুলেট পয়েন্টগুলি অনুসরণ করে তা আমাদের এসড ক্যোয়ারির এই অংশের সাথে সুনির্দিষ্ট।
    • ^এটি একটি রেজেক্স এক্সপ্রেশন যার অর্থ এটি একটি লাইনের শুরুর অবস্থানের সাথে মেলে। যার অর্থ, এটির মেলে দিবে $FOOBARএকটি লাইন শুরুতে না এবং নিম্নলিখিত মধ্যে একটি: $FOOBAR, THIS IS $FOOBAR, ইত্যাদি
    • '"এবং "'চারপাশে $FOOBAR, স্ক্রিপ্টটি ভেরিয়েবলকে সঠিকভাবে ব্যাখ্যা করে তা নিশ্চিত করার জন্য এটি প্রয়োজন। এটি না $FOOBARকরে এটি ভেরিয়েবলের অন্তর্ভুক্ত মানের পরিবর্তে ডকুমেন্টে মুদ্রণ শেষ করবে $FOOBAR। এর পরে সমান চিহ্নটি আমরা সন্ধান করছি এমন পাঠ্যের প্রত্যাশিত অংশের কেবলমাত্র অংশ।
    • {গ্রুপ কমান্ড ব্যবহার করা হয়।
    • hকমান্ড কপি হোল্ড বাফারের মধ্যে প্যাটার্ন বাফার পরে ব্যবহৃত হবে। এটি একটি একক লাইন বাফার, সুতরাং এটি একবারে একাধিক লাইন ধরে রাখতে পারে না।
    • ;কমান্ড এক লাইনে বিভিন্ন কিন্তু কমান্ড একত্রিত করতে ব্যবহার করা হয়। দুর্ভাগ্যক্রমে, এটি খারাপভাবে নথিভুক্ত বলে মনে হচ্ছে। আপনি এখানে আরও পড়তে পারেন http://www.grymoire.com/Unix/Sed.html#uh-61
    • sএকটি নতুন প্যাটার্ন প্রকাশ করে অংশ প্রতিস্থাপন জন্য ব্যবহার করা হবে।
    • .*একটি নতুন রেখা শুরুর আগে কোনও সংখ্যক অক্ষর অনুসারে সমান চিহ্নের সন্ধান করা, এই ক্ষেত্রে একটি রিজেক্স অভিব্যক্তি meaning এটি এর সমতুল্য চিহ্ন দ্বারা প্রতিস্থাপন করবে $newvalue, যেমন = yesবা হিসাবে = no। চলকটি $newvalueচারপাশে ঘিরে রয়েছে '"এবং "'একই কারণে $FOOBARতাদের রয়েছে। তারপরে আমরা সর্বশেষ সীমানাটি রেখেছি এবং গ্রুপযুক্ত কমান্ডটি বন্ধ করি।
  • এটি এখন আমাদের সেড কমান্ডের দ্বিতীয় অংশ। যে বুলেট পয়েন্টগুলি অনুসরণ করে তা আমাদের এসড ক্যোয়ারির এই অংশের সাথে সুনির্দিষ্ট। বারবার অংশগুলি এড়িয়ে যাবে।
    • $ফাইলের শেষ লাইনের শেষে খোঁজে। তারপরে আমরা একটি নতুন গ্রুপযুক্ত কমান্ড সিরিজ শুরু করি।
    • xহোল্ড বাফার সঙ্গে প্যাটার্ন স্থান বিনিময় হবে। এটি সেই অংশ যেখানে আমি নিজের কাছে কিছুটা অস্পষ্ট হয়ে উঠি তবে এটি আমার কাছে মনে হচ্ছে যে সেড পুরো ফাইলটি এই মুহুর্তে সংশোধন করছে, এখানে উল্লেখ করা হয়েছে। আমি শেষ বুলেট পয়েন্ট এ আরও ব্যাখ্যা করার চেষ্টা করি। এখানে আরও পড়ুন - http://www.grymoire.com/Unix/Sed.html#uh-53
    • ^$আমরা যে অনুচ্ছেদে রিটার্ন খুঁজছি তার অর্থ রেখার শুরু এবং শেষ উভয়ই, এই লাইনে কোনও ধরণের অক্ষর নেই।
    • তারপরে আমরা (গুলি) গুরুর দিকে এগিয়ে যাই যে ডাবল ডিলিমিটার বিস্মৃত চিহ্ন চিহ্ন এবং (গুলি) এর সাথে কোন অক্ষরের রেখাটি ভেরিয়েবল $FOOBARএবং এর সাথে যে মানটি দেয় না $newvalue
    • Hছোট হাতের হিসাবে একই hমধ্যে যে এটি একটি হোল্ড বাফার, কিন্তু এক একাধিক লাইনের জন্য অভিপ্রেত। আমরা সেই গোষ্ঠীকরণটি বন্ধ করে দিয়ে আবার এটির পরিবর্তে রাখি x। এটি মূলত যা করে তা হ'ল ডকুমেন্টের শীর্ষে আমাদের কাঙ্ক্ষিত লাইনটি .োকানো। সেড ডকুমেন্ট লাইন দিয়ে রেখায় সরানো হয়, নীচের নীচের লাইনটি নিয়ে যায় এবং আমরা সন্নিবেশ করানো রেখার উপরে নিয়ে যায় moving যেহেতু সেড একটি "পাইপ" এর মতো কাজ করে, স্ট্রিম এডিটর হয়ে থাকে, ডকুমেন্টের শেষ না হওয়া এবং প্রক্রিয়াকরণ পরিবর্তন বন্ধ না করা পর্যন্ত এটি এটি করবে।
  • এবং এটা শেষ ফাইল সংশোধন করা হয়: /home/pi/Public/test.txt

আমি মনে করি আমি সমস্ত কিছু ব্যাখ্যা করতে পেরেছি, প্রতিক্রিয়াটি স্বাগত।


প্রতিশ্রুতি অনুসারে আমি উত্সাহিত করেছি, যদিও আমি নিশ্চিত নই যে ব্যাখ্যাটি প্রতিটি ক্ষেত্রেই প্রযুক্তিগতভাবে সঠিক কিনা (আমি কোনও sedবিশেষজ্ঞ নই )। এটি শালীন দেখায়, আমি বিশ্বাস করি এটি আপনার পক্ষে কাজ করে এবং আমি জ্ঞান ভাগ করে নেওয়ার প্রশংসা করি - সুতরাং আপনি আমার উত্সাহের যোগ্য হয়েছিলেন। সত্যি বলতে এটি আমার প্রত্যাশার চেয়ে বেশি; আমার মতামত ব্যাখ্যাতে আপনি মূল কমান্ড বদলে গেছে একটি কেন ( /থেকে !ভেরিয়েবল প্রায় উদ্ধৃত সঠিক) যথেষ্ট হবে; আপনি যে জিনিসগুলি পরিবর্তন করেননি সেগুলি ব্যাখ্যা করা অতিরিক্ত কিছু (এবং এখনও দুর্দান্ত)। পার্শ্ব নোট: বড় হাতের অক্ষরগুলি সুপারিশ করা হয় না
কামিল ম্যাকিয়েরোভস্কি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.