সেড ব্যবহার করে প্রথম ম্যাচের পরে লাইন .োকান


245

কিছু কারণে আমি এর কোনও সরল উত্তর খুঁজে পাচ্ছি না এবং আমি এই মুহুর্তে কিছুটা সময়ের সঙ্কট করছি। sedকমান্ডটি ব্যবহার করে একটি নির্দিষ্ট স্ট্রিংয়ের সাথে মিলিত হওয়ার পরে প্রথম লাইনের পরে আমি কীভাবে পছন্দনীয় পাঠ্য সন্নিবেশ করবো ? আমার আছে ...

CLIENTSCRIPT="foo"
CLIENTFILE="bar"

এবং আমি লাইনটির পরে একটি লাইন সন্নিবেশ করতে চাই CLIENTSCRIPT=যার ফলস্বরূপ ...

CLIENTSCRIPT="foo"
CLIENTSCRIPT2="hello"
CLIENTFILE="bar"

উত্তর:


379

জিএনইউ সিড ব্যবহার করে এটি করার চেষ্টা করুন:

sed '/CLIENTSCRIPT="foo"/a CLIENTSCRIPT2="hello"' file

যদি আপনি জায়গায় স্থান পরিবর্তন করতে চান , ব্যবহার করুন

sed -i '/CLIENTSCRIPT="foo"/a CLIENTSCRIPT2="hello"' file

আউটপুট

CLIENTSCRIPT="foo"
CLIENTSCRIPT2="hello"
CLIENTFILE="bar"

ডক

  • দেখতে sed ডক এবং অনুসন্ধান করুন \a(সংযোজন)

ধন্যবাদ! এবং এটি ফাইলের বিষয়বস্তু প্রিন্ট না করে আবার ফাইলটি লিখতে পেতে?
ব্যবহারকারী 2150250

11
উল্লেখ্য যে উভয়ই জিএনইউ ধরে নিয়েছে sed। এটি স্ট্যান্ডার্ড sedসিনট্যাক্স নয় এবং অন্য কোনও sedপ্রয়োগের সাথে কাজ করবে না ।
স্টিফেন চেজেলাস

আমার পক্ষে এটি কাজ করতে সমস্যা হয়েছিল কারণ আমি অন্য একটি ডিলিমিটার ব্যবহার করছিলাম। আরটিএফএম'এর পরে, আমি বুঝতে পেরেছিলাম যে আমাকে একটি \, তার পরে ডিলিমিটার দিয়ে রেগেক্স শুরু করতে হবে।
খ্রিস্টি

10
এটি প্রথম ম্যাচে কীভাবে কেবল প্রয়োগ হয়? এটি স্পষ্ট যে এটি ম্যাচের পরে পাঠ্য সংযোজন করেছে, তবে এটি কেবল প্রথম ম্যাচের সাথে কীভাবে জানবে?
মোহাম্মদ নুরাল্ডিন

7
এটি আমার জন্য প্রতিটি ম্যাচের পরে পাঠ্য যুক্ত করে।
schoppenhauer

49

স্ট্যান্ডার্ড sedসিনট্যাক্সটি নোট করুন (যেমন পসিক্সের মতো, তাই sedআশেপাশের সমস্ত মাননীয় বাস্তবায়ন দ্বারা সমর্থিত (জিএনইউ, ওএস / এক্স, বিএসডি, সোলারিস ...)):

sed '/CLIENTSCRIPT=/a\
CLIENTSCRIPT2="hello"' file

বা এক লাইনে:

sed -e '/CLIENTSCRIPT=/a\' -e 'CLIENTSCRIPT2="hello"' file

( -eএক্সপ্রেসনগুলি (এবং আইলসের সামগ্রীগুলি -f) সেড স্ক্রিপ্টের sedব্যাখ্যা তৈরি করতে নতুন লাইনের সাথে যুক্ত হয়েছে )।

-iইন-জায়গা সম্পাদনার জন্য বিকল্প একটি গনুহ এক্সটেনশন, কিছু অন্যান্য বাস্তবায়নের সমর্থন (FreeBSD 'র মত) হল -i ''যে জন্য।

বিকল্প হিসাবে, বহনযোগ্যতার জন্য, আপনি perlপরিবর্তে ব্যবহার করতে পারেন :

perl -pi -e '$_ .= qq(CLIENTSCRIPT2="hello"\n) if /CLIENTSCRIPT=/' file

অথবা আপনি ব্যবহার করতে পারেন edবা ex:

printf '%s\n' /CLIENTSCRIPT=/a 'CLIENTSCRIPT2="hello"' . w q | ex -s file

2
আমি ভুল হতে পারি, তবে বর্তমানটি sed -e '/CLIENTSCRIPT=/a\' -e 'CLIENTSCRIPT2="hello"' fileপ্রথম প্যারামিটারের শেষে উদ্ধৃতিটি ছেড়ে দেয় এবং কমান্ডটি ভেঙে দেয়।
পরিত্যক্ত কার্ট

1
বোর্ন cshবা rcপরিবারের শেলগুলিতে @ অ্যাবোনডোনকার্ট, দৃ strong় '...'উদ্ধৃতি যা ভিতরে ব্যাকস্ল্যাশ বিশেষ নয়। আমার জানা একমাত্র ব্যতিক্রম fishশেল।
স্টিফেন চেজেলাস

1
MacOS- এ টার্মিনাল (এবং পরবর্তীকালে টার্মিনালটিতে স্ক্রিপ্ট চালানো) এটিও একটি ব্যতিক্রম, স্পষ্টতই। আমি বিকল্প সিনট্যাক্স পেয়েছি, তবে যাইহোক ধন্যবাদ।
পরিত্যক্ত কার্ট

1
অ্যান্ডোনাডকার্ট, এটি অন্যরকম কিছু। এটি ম্যাকোস sedএখানে পসিক্স অনুগত নয়। এটি আমার পোর্টেবলটিকে ভুল হওয়ার বিষয়ে বিবৃতি দেয় (এক লাইনের বৈকল্পিকের জন্য)। আমি ওপেনগ্রুপটি নিশ্চিত করার জন্য জিজ্ঞাসা করব যদি তা সত্যই আমার পক্ষে মানহীন বা মানটির ভুল ব্যাখ্যা করে থাকে।
স্টিফেন চেজেলাস

19

sকমান্ডটি ব্যবহার করে একটি পসিক্স অনুগত :

sed '/CLIENTSCRIPT="foo"/s/.*/&\
CLIENTSCRIPT2="hello"/' file

1
... এটি এমনকি নতুন লাইন সন্নিবেশ সমর্থন করে। আমি এটা ভালোবাসি!
স্টিফান হেনিংসেন

1
sed -e '/.../s/$/\' -e 'CLI.../'বৈধ অক্ষর তৈরি না করে বাইট ক্রমগুলি অন্তর্ভুক্ত রেখাগুলিতে কোনও সমস্যা এড়াতে পারে তা দেখুন ।
স্টিফেন চেজেলাস

14

সেড কমান্ড যা ম্যাকওএস (কমপক্ষে, ওএস 10) এবং ইউনিক্সে একইভাবে কাজ করে (যেমন গিলসের মতো গনু সেডের প্রয়োজন নেই (বর্তমানে স্বীকৃত) একটি করে:

sed -e '/CLIENTSCRIPT="foo"/a\'$'\n''CLIENTSCRIPT2="hello"' file

এটি ব্যাশ এবং সম্ভবত অন্যান্য শেলগুলিতেও কাজ করে যা $ '\ n' মূল্যায়নের উদ্ধৃতি শৈলী জানে। সবকিছু এক লাইনে থাকতে পারে এবং পুরানো / পসিক্স সেড কমান্ডে কাজ করতে পারে। যদি CLIENTScriptT = "foo" (বা আপনার সমতুল্য) সাথে একাধিক লাইন মিলছে এবং আপনি প্রথমবার কেবল অতিরিক্ত লাইন যুক্ত করতে চান, তবে আপনি এটি নীচে পুনরায় কাজ করতে পারেন:

sed -e '/^ *CLIENTSCRIPT="foo"/b ins' -e b -e ':ins' -e 'a\'$'\n''CLIENTSCRIPT2="hello"' -e ': done' -e 'n;b done' file

(এটি লাইন সন্নিবেশ কোডের পরে একটি লুপ তৈরি করে যা বাকী ফাইলটি কেবল চক্রচক্র করে, আবার কখনও প্রথম সেড কমান্ডে ফিরে না আসে)।

আপনি লক্ষ্য করতে পারেন যে লাইনটি কোনও মন্তব্যে, বলায় বা ইন্টেন্টেড অবস্থায় দেখায় সে ক্ষেত্রে আমি ম্যাচিং প্যাটার্নটিতে একটি '^ *' যুক্ত করেছি। এটি 100% নিখুঁত নয় তবে সাধারণ হওয়ার সম্ভাবনা রয়েছে এমন কিছু অন্যান্য পরিস্থিতিতে রয়েছে। প্রয়োজনীয় হিসাবে সামঞ্জস্য করুন ...

এই দুটি সমাধানও সমস্যাটিকে ঘিরে রেখেছে (একটি লাইন যুক্ত করার জেনেরিক সমাধানের জন্য) যে আপনার নতুন lineোকানো লাইনে যদি অবিরত ব্যাকস্ল্যাশ বা অ্যাম্পারস্যান্ড রয়েছে তবে সেগুলি সেড দ্বারা ব্যাখ্যা করা হবে এবং সম্ভবত যেমনটি \nহ'ল - যেমন।\0মিলবে প্রথম লাইন। বিশেষত সহজ আপনি যদি কোনও ভেরিয়েবল থেকে আসে এমন একটি লাইন যুক্ত করেন যেখানে আপনাকে প্রথমে $ {var // using, বা অন্য কোনও সেড স্টেটমেন্ট ইত্যাদি ব্যবহার করে প্রথমে সমস্ত কিছু থেকে বাঁচতে হবে d

এই সমাধানটি স্ক্রিপ্টগুলিতে কিছুটা কম অগোছালো (যে উদ্ধৃতি দেওয়া এবং read n যদিও পড়া সহজ নয়), যখন আপনি কোনও ফাংশনে বললে, কোনও লাইনের শুরুতে কমান্ডের জন্য প্রতিস্থাপন পাঠ্যটি রাখতে চান না ইন্ডেন্টেড লাইনের সাথে আমি সুবিধা নিয়েছি যে $ '\ n' শেল দ্বারা একটি নতুন লাইনে মূল্যায়ন করা হয়, এটি নিয়মিত '\ n' একক-উদ্ধৃত মানগুলিতে নয়।

এটি যথেষ্ট দীর্ঘ হয়ে গেছে যদিও আমি মনে করি পার্ল / এমনকি এডক আরও পঠনযোগ্য হওয়ার কারণে জিততে পারে।


1
উত্তরের জন্য ধন্যবাদ! প্রথমটি এআইএক্স ওএসেও কবজির মতো কাজ করে।
অভিষেক

মাল্টি-লাইন সন্নিবেশের জন্য আপনি কীভাবে এটি করেন?
তাতসু

1
পসিক্স সেড প্রতিস্থাপনের স্ট্রিংগুলিতে আক্ষরিক নিউলাইনগুলিকে সমর্থন করে যদি আপনি তাদের ব্যাকস্ল্যাশ ( উত্স ) দিয়ে "পলায়ন" করেন । তাই: s/CLIENTSCRIPT="foo"/&\ [Enter] CLIENTSCRIPT2="hello"/ । ব্যাকস্ল্যাশটি লাইনের একেবারে শেষ চরিত্র হতে হবে (এর পরে কোনও সাদা জায়গা নয়), এটি এই মন্তব্যে কেমন দেখায় তার বিপরীতে।
TheDudeAbides

1
উপরের আমার মন্তব্যে আমি বর্ণিত একই পদ্ধতিটি ব্যবহার করে @ ট্যাটসু নিউলাইনস এর প্রতিস্থাপনের স্ট্রিংয়ের s///পাশাপাশি একই সাথে আদেশ aএবং iকমান্ডের "পালাতে" পারা যায়।
TheDudeAbides

4

এর জন্য একটি উত্তর পোস্ট করতে কিছুটা দেরি হতে পারে তবে আমি উপরের সমাধানগুলির কয়েকটি খুঁজে পেয়েছি কিছুটা জটিল।

আমি সেডে সরল স্ট্রিং প্রতিস্থাপনের চেষ্টা করেছি এবং এটি কাজ করেছে:

sed 's/CLIENTSCRIPT="foo"/&\nCLIENTSCRIPT2="hello"/' file

& সাইন মেলে স্ট্রিং প্রতিফলিত করে এবং তারপরে আপনি \ n এবং নতুন লাইন যুক্ত করুন।

যেমনটি উল্লেখ করা হয়েছে, আপনি যদি এটি জায়গায় জায়গায় করতে চান:

sed -i 's/CLIENTSCRIPT="foo"/&\nCLIENTSCRIPT2="hello"/' file

আরেকটি বিষয়. আপনি একটি এক্সপ্রেশন ব্যবহার করে মেলাতে পারেন:

sed -i 's/CLIENTSCRIPT=.*/&\nCLIENTSCRIPT2="hello"/' file

আশা করি এটি কাউকে সাহায্য করবে


এটি লিনাক্সে দুর্দান্ত কাজ করে, যেখানে জিএনইউ সেড ডিফল্ট, কারণ এটি \nপ্রতিস্থাপনের স্ট্রিংয়ে বোঝে understand প্লেইন-ভ্যানিলা (পসিক্স) প্রতিস্থাপনের স্ট্রিংটিতে বুঝতে sedপারে না\n , সুতরাং এটি BSD বা ম্যাকোস-এ কাজ করবে না — যদি না আপনি কোনওভাবে GNU সেড ইনস্টল করেন। ভ্যানিলা সেডের সাহায্যে আপনি নিউলাইনগুলিকে "পলায়ন" করে এম্বেড করতে পারেন is অর্থাৎ ব্যাকস্ল্যাশ দিয়ে লাইনটি শেষ করে, [Enter] টিপুন ( রেফারেন্স , শিরোনামের নীচে [2addr]s/BRE/replacement/flags)। এর অর্থ আপনার সিড কমান্ডটি টার্মিনালে একাধিক লাইন বিস্তৃত করতে হবে।
TheDudeAbides

রিপ্লেসমেন্ট স্ট্রিংয়ে আক্ষরিক নিউলাইন পাওয়ার জন্য অন্য বিকল্প হ'ল এএনএসআই-সি উদ্ধৃতি বৈশিষ্ট্যটি ব্যাশ -এ ব্যবহার করা , যেমন অন্য উত্তরের একটিতে উল্লিখিত হয়েছে ।
TheDudeAbides


1

আমার অনুরূপ একটি কাজ ছিল এবং আমি উপরের পার্ল সমাধানটি কাজ করতে সক্ষম হইনি।

এখানে আমার সমাধান:

perl -i -pe "BEGIN{undef $/;} s/^\[mysqld\]$/[mysqld]\n\ncollation-server = utf8_unicode_ci\n/sgm" /etc/mysql/my.cnf

ব্যাখ্যা:

আমার /etc/mysql/my.cnf ফাইলটিতে একটি লাইন অনুসন্ধান করতে একটি নিয়মিত অভিব্যক্তি ব্যবহার করে যা কেবল এতে অন্তর্ভুক্ত করে [mysqld]এবং এর সাথে প্রতিস্থাপন করেছে

[mysqld] collation-server = utf8_unicode_ci

কার্যকরভাবে collation-server = utf8_unicode_ciলাইন ধারণকারী লাইনের পরে লাইন যুক্ত [mysqld]


0

ম্যাক এবং লিনাক্স ওএস উভয়ের জন্যই আমাকে সম্প্রতি এটি করতে হয়েছিল এবং অনেকগুলি পোস্টের মাধ্যমে ব্রাউজ করার পরে এবং অনেকগুলি জিনিস চেষ্টা করার পরে, আমার বিশেষ মতামত হিসাবে আমি কখনই চাইনি যেখানে পাইনি: সুপরিচিত ব্যবহার করে সমাধান বোঝার পক্ষে যথেষ্ট সহজ এবং আরও সাধারণ প্রতিবন্ধকতা যুক্ত করতে সাধারণ নিদর্শন, একটি লাইনার, পোর্টেবল, প্রসারণযোগ্য সহ স্ট্যান্ডার্ড কমান্ডগুলি। তারপরে আমি এটিকে অন্য দৃষ্টিকোণ দিয়ে দেখার চেষ্টা করেছি, এটি যখন আমি বুঝতে পেরেছিলাম যদি "2-লাইনার" আমার বাকি মানদণ্ডগুলি পূরণ করে তবে আমি "ওয়ান লাইনার" বিকল্পটি ছাড়া করতে পারি। শেষ পর্যন্ত আমি এই সমাধানটি নিয়ে এসেছি আমি পছন্দ করি উবুন্টু এবং ম্যাক উভয় ক্ষেত্রে যা আমি সবার সাথে ভাগ করে নিতে চাই:

insertLine=$(( $(grep -n "foo" sample.txt | cut -f1 -d: | head -1) + 1 ))
sed -i -e "$insertLine"' i\'$'\n''bar'$'\n' sample.txt

প্রথম কমান্ডে, গ্রেপ "foo" ধারণকারী লাইন সংখ্যাগুলির জন্য অনুসন্ধান করে, কাট / মাথাটি 1 ম উপস্থিতি নির্বাচন করে, এবং গাণিতিক ওপ বর্ধিত হয় যা প্রথম সংখ্যার লাইন সংখ্যা 1 দ্বারা 1 করে থাকে কারণ আমি ঘটনার পরে সন্নিবেশ করতে চাই। দ্বিতীয় কমান্ডে, এটি সন্নিবেশ করানোর জন্য একটি "ইন-প্লেস ফাইল সম্পাদনা": একটি এনসিস-সি উদ্ধৃতি করে নতুন লাইন, "বার", তারপরে আরেকটি নতুন লাইন। ফলাফলটি "ফু" লাইনের পরে "বার" যুক্ত একটি নতুন লাইন যুক্ত করছে। এই 2 টি কমান্ডের প্রতিটি আরও জটিল ক্রিয়াকলাপ এবং মেলাতে প্রসারিত হতে পারে।

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