সেড দিয়ে লাইনের শেষ কীভাবে সনাক্ত করা যায়


15

আমি যখন সর্বশেষ অক্ষরটি একটি নতুন লাইন ব্যবহার করে তখন কেবল প্রতিস্থাপন সম্পাদনের জন্য একটি উপায় খুঁজছি sed

এই ক্ষেত্রে:

lettersAtEndOfLine

প্রতিস্থাপন করা হয়েছে, কিন্তু এটি নয়:

lettersWithCharacterAfter&

যেহেতু sedনিউলাইনগুলি নিয়ে ভাল কাজ করে না, এটি এতটা সহজ নয়

$ sed -E "s/[a-zA-Z]*\n/replace/" file.txt

এই কিভাবে এটি করা সম্ভব?

উত্তর:


21

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

নিয়মিত এক্সপ্রেশনগুলি ব্যবহার করে (বা শুরুতে, ব্যবহার করে ) লাইনের শেষে অ্যাঙ্কর করা যেতে পারে । একটি লাইনের শুরু / শেষে একটি অভিব্যক্তি নোঙ্গর করা একে একে ঠিক সেখানে মিলাতে বাধ্য করে, এবং কেবল লাইনের কোথাও নয়।$^

আপনি যদি কিছু [A-Za-z]*দিয়ে লাইনের শেষে প্যাটার্নের সাথে মিলে যাওয়া কোনও কিছু প্রতিস্থাপন করতে চান তবে প্যাটার্নটি এই জাতীয়ভাবে অ্যাঙ্করিং করুন:

[A-Za-z]*$

... এটি লাইনের শেষে এবং অন্য কোথাও মিলতে বাধ্য করবে।

যাইহোক, [A-Za-z]*$এছাড়াও সাথে মেলে কিছুই (উদাহরণস্বরূপ, শেষে খালি স্ট্রিং উপস্থিত প্রত্যেক লাইন), আপনি ম্যাচিং বাধ্য প্রয়োজন কিছু নির্দিষ্ট করে, যেমন

[A-Za-z][A-Za-z]*$

অথবা

[A-Za-z]\{1,\}$

সুতরাং, আপনার সেড কমান্ড লাইন এইভাবে হবে

$ sed 's/[A-Za-z]\{1,\}$/replace/' file.txt

আমি -Eএখানে সুইচটি ব্যবহার করি নি কারণ এটির প্রয়োজন নেই। এটি দিয়ে, আপনি লিখতে পারে

$ sed -E 's/[A-Za-z]+$/replace/' file.txt

এটা স্বাদের বিষয়।


মন্তব্যগুলি বর্ধিত আলোচনার জন্য নয়; এই কথোপকথন চ্যাটে সরানো হয়েছে ।
কুসালানন্দ

3
sed "s/[a-zA-Z]*$/replace/" input.txt > result.txt

বা, দীর্ঘ জটিল অপ্রয়োজনীয় উপায়:

আমি খুঁজে পেয়েছি, এটি ট্রের সাহায্যে এখনও সেড ব্যবহার করে করা যেতে পারে। লাইনের শেষটি উপস্থাপন করার জন্য আপনি অন্য একটি চরিত্র নির্ধারণ করতে পারেন। এই ক্ষেত্রে "` "- তে অন্য একটি অস্থায়ী চরিত্র ব্যবহার করতে হবে। লাইনের শেষটি উপস্থাপন করতে "~" ব্যবহার করুন:

tr '\n' '`' <input.txt >output.txt
sed -i "s/`/~`/" output.txt
tr '`' '\n' <output.txt >result.txt

এবং তারপরে প্রকৃত অনুসন্ধান সম্পাদন করতে এবং প্রতিস্থাপন করতে "\ n" এর পরিবর্তে "~" ব্যবহার করুন:

sed -i -E "s/[a-zA-Z]*~/replace/" result.txt

এবং তারপরে অন্যান্য লাইনে অতিরিক্ত অক্ষরটি পরিষ্কার করুন:

sed -i "s/~//" result.txt

স্পষ্টতই, এগুলি সমস্ত একসাথে পাইপ করা যেতে পারে যার ফলে এমন কিছু ঘটে:

tr '\n' '`' <input.txt | sed -e "s/`/~`/" | tr '`' '\n' | sed -E -e "s/[a-zA-Z]*~/replace/" | sed "s/~//" > result.txt

3
নিশ্চিত যে আমি বুঝতে পেরেছি না ... আপনি কেন লাইন শেষ করতে নোঙ্গর করবেন না $? যেমনs/[a-zA-Z]*$/replace/
don_crissti

1
2 পয়েন্ট: 1) আপনি ভাল ব্যবহার করতে চাই \+পরিবর্তে *যেহেতু আধুনিক পারবেন শূন্য স্ট্রিং এর শেষে অক্ষর; 2) আপনি একটি অক্ষর ক্লাস ব্যবহার করতে পারেন [[:alpha:]]। সুতরাং:sed 's/[[:alpha:]]\+$/replace/' file
গ্লেন জ্যাকম্যান

প্লাগের আগে ব্যাকস্ল্যাশটি কী? যে যোগ চরিত্রের সাথে মেলে না?
ম্যাথু ডি স্কোলফিল্ড


0

আপনার পোস্ট করা (ভাঙা) কোড স্নিপেট থেকে, আপনিও নতুন লাইনটি প্রতিস্থাপন করতে চান বলে মনে হয়। সেক্ষেত্রে নিজে থেকে রেজেক্স অ্যাঙ্করিং আপনাকে সহায়তা করতে পারে না। নিম্নলিখিতটি একটি সমাধান:

sed '/[[:alpha:]]\+$/{N;s/[[:alpha:]]\+\n/replace/}' your_file

ভেঙ্গে পড়া:

  • /[a-zA-Z]\+$/{} মানে রেজেক্সের সাথে মিলে যাওয়া লাইনে কারিগুলির ভিতরে যা আসে তা প্রয়োগ করুন।
  • রেজেক্স হ'ল গ্যালেন জ্যাকম্যানের মন্তব্যগুলিকে বিবেচনায় নিতে সংশোধিত আপনার নিজের উত্তরে দেখা হিসাবে অ্যাঙ্করিং ব্যবহার করে।
  • কোঁকড়ার অভ্যন্তরের Nঅর্থ, "সক্রিয় বাফারে পরবর্তী লাইনটি সংযোজন করুন" (যা sed'প্যাটার্ন স্পেস' বলে ডাকে)
  • পরিশেষে s///বিবৃতিটি আপনার প্রয়োজনীয় প্রতিস্থাপন। এটি এখন কাজ করে কারণ প্যাটার্ন স্পেসে দুটি ধারাবাহিক রেখা থাকে এবং নিউলাইনটি তাই এর একটি অংশ।

0

লাইনের শেষটি সন্ধান করতে, কেবল $-সাইন ব্যবহার করুন :

লাইন অ্যাঙ্কারের শেষ ছাড়াই:

sed -n '/pattern/p' file 

লাইন অ্যাঙ্কারের শেষ ছাড়াই:

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