ফাইলটি এখনও সেখানে না থাকলে কেবল কীভাবে কিছু শেষে যুক্ত করা যায়?


10

আমি আমার স্ক্রিপ্টের বুলেট-প্রুফ তৈরি করতে এখনও উপস্থিত না থাকলে কেবল একটি লাইন যুক্ত করে কোনও ফাইলকে ঠিক জায়গায় সম্পাদনা করতে চাই।

সাধারণত আমি এমন কিছু করতাম:

cat >> ~/.bashrc <<EOF
export PATH=~/.composer/vendor/bin:\$PATH
EOF

জবাবদিহি ( line+ insertafter=EOF+ regexp) এর মাধ্যমে এটি করাও সম্ভব তবে এটি অন্য গল্প।

Vi / প্রাক্তনে আমি এর মতো কিছু করতে পারি:

ex +'$s@$@\rexport PATH=\~/.composer/vendor/bin:$PATH@' -cwq ~/.bashrc

তবে কীভাবে আমি লাইনটি ইতিমধ্যে একই লাইনের পুনরাবৃত্তি না করে আদর্শভাবে (এবং এইভাবে কিছুই না করে) আছে কিনা তা পরীক্ষা করব?

অথবা প্রাক্তন সম্পাদকটিতে এটি করার কিছু সহজ উপায় আছে?


আপনি কি এটি আউটসোর্স করতে পারবেন না? grep -Fq 'export PATH=~/.composer/vendor/bin:$PATH' ~/.bashrc || ex ...(বা cat, এই বিষয়ে)?
মুরু

আমি বিশ্বাস করি এটি এই পদ্ধতির অনুরূপ কিছু হতে পারে , তবে বিপরীত (যখন স্ট্রিংটি নেই তখন কিছু করুন)।
কেনারব

ex ~/.bashrc -c "if search('export PATH=\~\/.composer\/vendor\/bin:\$PATH')>0 | norm quit | endif | norm Aexport PATH=~/.composer/vendor/bin:$PATH"
অ্যালেক্স ক্রোল 14

1
মনে রাখবেন যে exportএটি একটি কমান্ড , সুতরাং লাইনটির বাকী অংশটি শেল শব্দ, কোনও কাজ নয়। অতএব একটি পরিবর্তনশীল অ্যাসাইনমেন্টের সাথে ভিন্ন (এটি ব্যবহার করে না export) আপনার ডাবল উদ্ধৃতি প্রয়োজন বা এটি হোয়াইটস্পেসে ভেঙে যাবে । আরো দেখুন কিভাবে সঠিকভাবে পথে একটি পাথ যোগ করার জন্য
ওয়াইল্ডকার্ড

1
গতকাল আমি যে সত্যিকারের লিঙ্কটি খুঁজছিলাম তা পেয়েছি (যদিও উপরের লিঙ্কগুলিও ভাল)। স্থানীয় ভেরিয়েবল অ্যাসাইনমেন্টের জন্য কোটগুলি দরকার?
ওয়াইল্ডকার্ড

উত্তর:


6

আপনি যদি বুলেটপ্রুফ চান তবে উপরের জটিল বিকল্পগুলির চেয়ে আপনি সম্ভবত কিছুটা বেশি পোর্টেবল কিছু চান। আমি POSIX এর বৈশিষ্ট্যগুলিকে আঁকড়ে ধরেex এটি নির্বোধ-সহজ করে দেব : কেবল সেখানে লাইনটি সরিয়ে ফেলুন (এটি যতবারই থাকুক না কেন), ফাইলটির শেষে যুক্ত করুন, তারপরে সংরক্ষণ করুন এবং প্রস্থান করুন:

ex -sc 'g/^export PATH=\~\/\.composer\/vendor\/bin:\$PATH$/d
$a
export PATH=~/.composer/vendor/bin:$PATH
.
x' ~/.bashrc

আমি যুক্ত দৃ rob়তার জন্য রেজেক্সকে নোঙ্গর দিয়েছি, যদিও আমি মনে করি দুর্ঘটনাক্রমে এই রেজেক্সটি মিলানো প্রায় অসম্ভব । (অ্যাঙ্করড মানে ব্যবহার করা ^এবং $তাই রেজেক্স কেবল তখনই মিলবে যদি এটি একটি সম্পূর্ণ লাইনের সাথে মেলে ))

নোট করুন যে +cmdসিনট্যাক্সটি পসিক্সের দ্বারা প্রয়োজন হয় না, বা একাধিক -cযুক্তির অনুমতি দেওয়ার সাধারণ বৈশিষ্ট্যও নয় ।


এটি করার জন্য আরও অনেক সহজ উপায় রয়েছে। উদাহরণস্বরূপ, ফাইলের শেষে লাইনটি যুক্ত করুন, তারপরে বাহ্যিক ইউনিক্স ফিল্টারটির মাধ্যমে ফাইলের শেষ দুটি লাইন চালান uniq:

ex -sc '$a
export PATH=~/.composer/vendor/bin:$PATH
.
$-,$!uniq
x' input

এটি খুব পরিষ্কার এবং সাধারণ এবং পুরোপুরি পসিক্স-অনুগতও। এটি বাহ্যিক পাঠ্য ফিল্টারিংয়ের জন্য এসেস্ক বৈশিষ্ট্যex এবং পসিক্স-নির্দিষ্ট শেল ইউটিলিটি ব্যবহার করেuniq

বটম লাইন, তাই exহয় পরিকল্পিত ইন-জায়গা ফাইল সম্পাদনার জন্য এবং এটি দ্বারা পর্যন্ত সবচেয়ে পোর্টেবল উপায় যে সম্পন্ন করার জন্য একটি নন-ইন্টারেক্টিভ ফ্যাশন। এটি এমনকি আসলটিকে পূর্বাভাস দেয় vi, প্রকৃতপক্ষে name নামটি vi"ভিজ্যুয়াল সম্পাদক" এর জন্য এবং অ-ভিজ্যুয়াল সম্পাদক এটির উপরে নির্মিত হয়েছিল ex ))


আরও বৃহত্তর সরলতার জন্য (এবং এটি একটি একক লাইনে হ্রাস করতে) printfকমান্ডগুলি প্রেরণ করতে ব্যবহার করুন ex:

printf %s\\n '$a' 'export PATH=~/.composer/vendor/bin:$PATH' . '$-,$!uniq' x | ex input


2

এটির জন্য একটি ফাংশন তৈরি করা একটি সম্ভাব্য সমাধান:

function! AddLine()

    let l:res = 0
    g/export PATH=\~\/.composer\/vendor\/bin:\\\$PATH/let l:res = l:res+1

    if (l:res == 0)
        normal G
        normal oexport PATH=~/.composer/vendor/bin:\$PATH
    endif

endfunction

প্রথমে আমরা একটি স্থানীয় ভেরিয়েবল তৈরি করি l:resযা লাইনের উপস্থিতিগুলির সংখ্যা গণনা করতে ব্যবহৃত হবে।

আমরা globalকমান্ডটি ব্যবহার করি : প্রতিবার লাইনটি মিললে, l:resবর্ধিত হয়।

শেষ অবধি যদি l:resএখনও 0 হয় তবে এর অর্থ এই যে ফাইলটি লাইনটি উপস্থিত হবে না তাই আমরা শেষ লাইনে ধন্যবাদ জানাই G, এবং আমরা একটি নতুন লাইন তৈরি oকরি যার সাথে আমরা যুক্ত করতে লাইনটি লিখি।

দ্রষ্টব্য 1 আমি যে পদ্ধতিটির মান নির্ধারণ করতে ব্যবহার করেছি তা l:resসামান্য ভারী এবং @ অ্যালেক্স তার দেওয়া উত্তরের প্রস্তাবিত একটি দ্বারা এর পরিবর্তে এমন কিছু দিয়ে প্রতিস্থাপন করতে পারে :

let l:res = search('export PATH=\~\/.composer\/vendor\/bin:\\\$PATH')

দ্রষ্টব্য 2 এছাড়াও ফাংশনটিকে আরও নমনীয় করে তুলতে আপনি যুক্তিগুলি ব্যবহার করতে পারেন:

function! AddLine(line)

    let l:line =  escape(a:line, "/~$" )

    let l:res = 0
    exe "g/" . l:line . "/let l:res = l:res+1"

    if (l:res == 0)
        normal G
        exe "normal o" . a:line
    endif

endfunction
  • অক্ষরগুলির সামনে escape()একটি যুক্ত করার কৌশলটি নোট করুন \যা অনুসন্ধানে সমস্যা হতে পারে।
  • আরও মনে রাখবেন যে \ফাংশনটি কল করার সময় আপনাকে নিজের দ্বারা পালাতে হবে (আমি \স্বয়ংক্রিয়ভাবে পালাতে সক্ষম হইনি ):

    call AddLine("export PATH=~/.composer/vendor/bin:\\$PATH")
    

2

চেষ্টা করুন:

ex ~/.bashrc -c "if search('export PATH=\~\/.composer\/vendor\/bin:\$PATH')>0 | norm quit | endif | norm Aexport PATH=~/.composer/vendor/bin:$PATH"

নোট করুন যে প্রস্থান মোড ( ভিমডক দেখুন ) এর সাথে -র ব্লক :appendভিতরে কাজ করবে না তাই আমাকে বাইরে রাখতে হবে।if endifnorm A...


1

আমি সাধারণত:

perl -i -p0e '$_.="export PATH=~/bin:\$PATH\n" unless m!~/bin:!' ~/.bashrc

1

অনেকের উপস্থিতি সরল করতে এবং এড়ানোর জন্য \, যুক্ত হওয়া লাইনটি হবে export PATH=mybin:PATH

মূল কৌশল: mybinপাঠ্য + মাইবিন-পাথ-সংজ্ঞা সহ "নন- টেক্সট (সমস্ত ফাইল )কে বিকল্প দিন :

 vim  +'s#\v%^((.|\n)(mybin:)@!)*%$#&\rexport PATH=mybin:PATH#e' -cx bashrc

বা আরও যুক্তিযুক্ত ইন্ডেন্টেশন সহ :

s#                                    substitute
   \v                                  very magical to redude \

   %^                                  file begin
   ((.|\n)(mybin:)@!)*                 multi-line str without "mybin:"
                                         (any char not followed by "mybin")*
   %$                                  end of file
 #                                    by

আমাদের যদি একটি ম্যাচ থাকে:

  1. &সম্পূর্ণ টেক্সট হয়েছে bashrcএবং
  2. & থাকে না /mybin:/

তাই:

 #                                    by ...
   &                                   all file
   export PATH=mybin:PATH              and the new path
 #e                                   don't complain if patt not found

-cx                                   save and leave 

আপডেট : অবশেষে, আমরা একটি ভিম স্ক্রিপ্ট তৈরি করতে পারি:

$ cat bashrcfix

#!/usr/bin/vim -s
:e ~/fakebashrc
:s#\v%^((.|\n)(mybin:)@!)*%$#&\rexport PATH=mybin:PATH#e
:x

chmod 755 এবং এটি ইনস্টল করুন। ব্যবহার:bashrcfix


সাবধান: \vমোডে, =মানে alচ্ছিক


1

ভাল উত্তর পুরানো শেল কমান্ড সম্পর্কে এই উত্তরগুলির বেশিরভাগই জটিল বলে মনে হচ্ছে:

grep composer/vender ~/.bashrc || cat >> ~/.bashrc <<EOF
export PATH=~/.composer/vendor/bin:\$PATH
EOF

এটি সহজেই কোনও বাশ ফাংশন হতে পারে:

addBashrcPath() {
  if ! grep "$1" ~/.bashrc >/dev/null 2>&1; then
    printf 'export PATH=%s:$PATH' "$1" >> ~/.bashrc
  fi
}

addBashrcPath "~/.composer/vendor/bin"

সম্পাদনা : গ্রেপের প্রস্থান কোডটি গুরুত্বপূর্ণ এবং এই ক্ষেত্রে এটির বিপরীত ব্যবহার করা দরকার ! grep; grep -vএই পরিস্থিতিতে প্রত্যাশা হিসাবে প্রস্থান করবে না। আপনাকে ধন্যবাদ জয়েটউইডল টিপটির জন্য।


আমার মনে হয় না যে grep -vআপনি চাইবেন এমন প্রস্থান কোড দেয়। তবে ! grepএটা করা উচিত।
জোয়েটউইডেল 4'15

যদি এটি হয় তবে আপনার -vকেবলমাত্র প্রয়োজন নেই !
সুকিমা

যথাযথভাবে। সেই সংশোধন করতে আপনি নিজের উত্তরটি সম্পাদনা করতে পারেন।
জোয়েটউইডেল

1
১. আপনার এমন ব্যবহার করা উচিত -Fযাতে grepঅক্ষরগুলিকে নিয়মিত অভিব্যক্তি হিসাবে ব্যাখ্যা না করা হয় এবং ২. এ -qপুনঃনির্দেশের পরিবর্তে ব্যবহার করুন /dev/nullপ্রশ্নে আমার আগের মন্তব্য দেখুন ।
মারু

ভাল দিক. কৌতূহল কীভাবে বহনযোগ্য -qএবং -Fবিকল্পগুলি? আমি ভেবেছিলাম >/dev/nullবিভিন্ন প্ল্যাটফর্মগুলির মধ্যে এটি আরও সার্বজনীন ছিল (সূর্য বনাম এইচপি বনাম ম্যাক ওএস এক্স বনাম উবুন্টু বনাম ফ্রিবিএসডি বনাম…)
সুকিমা
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.