আমি কীভাবে কোনও ফাইলের সর্বশেষ এন লাইনগুলি সম্পাদনা করতে পারি?


10

এমন একটি কমান্ড আছে যা আমাকে কোনও ফাইলের শেষ n লাইনগুলি সম্পাদনা করার অনুমতি দেবে? আমার বেশ কয়েকটি ফাইল রয়েছে, যেগুলির ভিতরে সমস্ত লাইনের বিভিন্ন সংখ্যা রয়েছে। তবে আমি প্রতিটি ফাইলে সর্বশেষ এন লাইনগুলি সংশোধন করতে চাই। লক্ষ্যটি হ'ল শেষ এন লাইনে সেমিকোলন দিয়ে কমাগুলি প্রতিস্থাপন করা। তবে শুধুমাত্র খুব শেষ এন লাইনে।

আমি কোনও লাইন মুছতে চাই না, আমি কেবল প্রতিটি ফাইলের শেষ এন লাইনে প্রতিটি কমাটি একটি সেমিকোলন দিয়ে প্রতিস্থাপন করতে চাই।

সেড কমান্ড ব্যবহার করে আমি এই কমান্ডটি দিয়ে খুব শেষ লাইনটি প্রতিস্থাপন করতে সক্ষম হয়েছি। এখানে বর্ণিত হিসাবে: আমি কীভাবে কোনও ফাইলের শেষ লাইনে পাঠ্য সরাতে পারি?

তবে এটি আমাকে কেবলমাত্র শেষ লাইনটি সংশোধন করতে সক্ষম করেছে এবং লাইনগুলির শেষ n সংখ্যাটি নয়।


1
কেবল প্রারম্ভিক রেখাটি sed '24,$s/,/:/g' filename কোথায় রয়েছে 24তা ব্যবহার করে
ভ্যালেন্টিন

উত্তর:


13

শেষ এন লাইনে সেমিকোলনের সাথে কমাগুলি প্রতিস্থাপন করতে ed:

n=3
ed -s input <<< '$-'$((n-1))$',$s/,/;/g\nwq'

পৃথক পৃথক:

  • ed -s = চুপচাপ এড চালান (শেষে লেখা বাইটগুলি রিপোর্ট করবেন না)
  • '$-'= ফাইলের শেষে থেকে $) বিয়োগ ...
  • $((n-1)) = এন -1 লাইন ...
  • ( $' ... '= এটি শেল থেকে রক্ষা করার জন্য অবশিষ্ট কমান্ডটি উদ্ধৃত করুন)
  • ,$s/,/;/g= ... ফাইল ( ,$) শেষ হওয়া অবধি , অনুসন্ধান এবং সেমিকোলনগুলির সাথে সমস্ত কমাগুলি প্রতিস্থাপন করুন।
  • \nwq = পূর্ববর্তী কমান্ডটি শেষ করুন, তারপরে সংরক্ষণ করুন এবং প্রস্থান করুন

শেষ এন লাইনে সেমিকোলনের সাথে কমাগুলি প্রতিস্থাপন করতে sed:

n=3
sed -i "$(( $(wc -l < input) - n + 1)),\$s/,/;/g" input

পৃথক:

  • -i = "জায়গায় জায়গায়" ফাইল সম্পাদনা করুন
  • $(( ... )) = কিছু গণিত করুন:
  • $( wc -l < input) = ফাইলটিতে রেখার সংখ্যা পান
  • -n + 1 = পিছনে n-1 লাইন যান
  • ,\$ = এন -1 লাইন থেকে ফাইলের শেষ অবধি:
  • s/,/;/g = সেমিকোলন দিয়ে কমাগুলি প্রতিস্থাপন করুন।

wc -l < inputসঙ্গে প্রতিস্থাপন করতে পারেন wc -l input। কয়েক ন্যানোসেকেন্ডের দ্বারা দ্রুত হওয়া উচিত :)
বাগানের মাথা

1
ছাড়া wc -l inputআউটপুট পাশাপাশি ফাইলের নাম; আমরা কেবল লাইন গণনা চাই
জেফ শ্যাচলার

এড সহ প্রথম পরামর্শটি সূক্ষ্ম এবং সহজ।
sku2003

আমি আসলে সম্পূর্ণ ভিন্ন দিক থেকে সহায়তা পেয়ে শেষ করেছি। এটি কোডের এই বিজোড় টুকরোটির ফলস্বরূপ, সেই কৌশলটি করে তবে এটি দীর্ঘ এবং অদ্ভুত। আমি অনুমান করি যে এটি এমন কিছু অদ্ভুত জিনিস যা আপনি যখন শেষ করতে পারেন তখন সমাধানের একসাথে অংশ নিতে পারেন। যাইহোক আপনার নিজের চেয়ে সুন্দর, খাটো এবং কম জটিল: এখানে
কোডটিও

বিড়াল ইনপুট.ফাইল | সেডস এর /, /, \ n / জি '| সেড-এন '1! জি; এইচ; $ পি' | awk -vn = 2 'NR <= n {gsub (",", ";", $ 0) {{মুদ্রণ}' | সেড-এন '1! জি; এইচ; $ পি' | সেড '/ ^ \ s * $ / d'> আউটপুট.ফাইল
sku2003

6

ফাইল এবং টেক্সটের শেষ 50 লাইনে প্রতিটি কমাটি সেমিকোলন দিয়ে প্রতিস্থাপন করতে ট্যাক এবং সেড ব্যবহার করে সমাধান :

tac file.txt | sed '1,50s/,/;/g' | tac

5

জিএনইউ headএবং বোর্নের মতো শেল সহ:

n=20
{ head -n -"$n"; tr , ';'; } < file 1<> file

আমরা ফাইলটি নিজেই ওভাররাইট করছি। এটি এখানে বাইট-টু-বাইট ট্রান্সিলিটের জন্য ঠিক আছে তবে পরিবর্তনটি যদি ফাইলের আকার পরিবর্তন করে তবে ( উদাহরণস্বরূপ , আপনি উদাহরণটি 1<> fileদিয়ে প্রতিস্থাপন করতে চান > other-file && mv other-file file) প্রয়োজন হয় না।


1
এখানে দস্তাবেজগুলি1<> , যার সাথে আমি অপরিচিত ছিলাম। এছাড়াও, পাইরেখাগুলি যেখানে আপনি নিজের ইনপুটটি ওভাররাইট করতে চান সেখানে মুরতালগুলিsponge থেকে একটি ভাল সরঞ্জাম।
মাইল

1

ধরে নেওয়া যাক আমরা 7শেল স্ক্রিপ্ট এবং GNU এর প্রয়োগের সাথে নিম্নলিখিত ক্রমের শেষ লাইনগুলি প্রতিস্থাপন করতে চাই sed:

$ seq 20
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20

পদক্ষেপ 1 : নীচের মতো ক্রমের শেষ লাইন নম্বরটি পেতে দিন। কটাক্ষপাত এই এবং যে :

$ lastLine=`seq 20|sed -n '$='`

$ echo $lastLine 
20

পদক্ষেপ 2 : লাইনের সংখ্যা নির্ধারণ করতে দিন (ক্রম শেষে) আমরা সম্পাদনা করতে চাই:

$ numberOfLines=7

$ echo $numberOfLines 
7

পদক্ষেপ 3 : নীচের মত পূর্ববর্তী ভেরিয়েবলের উপর ভিত্তি করে স্টার্ট লাইনটি গণনা করা যাক। কটাক্ষপাত এই :

$ startLine=`expr $lastLine - $numberOfLines + 1`

$ echo $startLine 
14

পদক্ষেপ 4 : এখন, আমরা নীচের মত অন্য কিছু দিয়ে সিকোয়েন্সের শেষ 7 লাইন প্রতিস্থাপন করতে পারি। কটাক্ষপাত এই :

$ seq 20|sed -e "$startLine,+$numberOfLines{s/[12]/WoW/}"
1
2
3
4
5
6
7
8
9
10
11
12
13
WoW4
WoW5
WoW6
WoW7
WoW8
WoW9
WoW0

পদক্ষেপ 4 সিড ম্যান পৃষ্ঠার ৪.৪ বিভাগ ব্যবহার করছে যা বলে:

'ADDR1,+N'
     Matches ADDR1 and the N lines following ADDR1.

পদক্ষেপ 4, এখানে উল্লিখিত হিসাবে ডাবল-কোট ব্যবহার করছে ।


ভাল, 4 টি পদক্ষেপ অপ্রয়োজনীয় যদি আমরা এইভাবে গোহুর উত্তরটি ব্যবহার করি :

$ seq 20 |tac|sed -e '1,7{s/[12]/WoW/}'|tac
1
2
3
4
5
6
7
8
9
10
11
12
13
WoW4
WoW5
WoW6
WoW7
WoW8
WoW9
WoW0

0

tailসিড করতে পাইপ এবং ব্যবহার করুন :

tail -n 20 file | sed 's/,/;/g'

এটি শেষ 20 লাইনের জন্য ফাইলটিতে কাজ করে। আপনি চাইলে ফাইলটি সরাসরি ব্যবহার করতে পারেন:

tail -n 20 file | sed -i 's/,/;/g'

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