আমি কীভাবে কোনও ফাইলের নির্দিষ্ট লাইনগুলি (লাইন নম্বর ব্যবহার করে) সরিয়ে ফেলব?


27

নির্দিষ্ট ফাইল রয়েছে যা আমি একটি ফাইল থেকে মুছতে চাই। আসুন এটি ২০-৩7 লাইন এবং তারপরে ৪৫ নম্বর লাইনটি বলুন those এই লাইনের সামগ্রীটি উল্লেখ না করে আমি কীভাবে এটি করব?


আপনার ফাইলটি কত বড়? এটি কি স্মৃতিতে লোড করা যায়?
ফাহিম মিঠা

কয়েক কিলোবাইট।
tshepang

উত্তর:


29

সাথে sed, যেমন:

sed '20,37d; 45d' < input.txt > output.txt

আপনি যদি জায়গাটিতে এটি করতে চান:

sed --in-place '20,37d; 45d' file.txt

এটি জায়গায় জায়গায় করার কোনও উপায় আছে?
tshepang

আমি
সেড

1
@ শেপাপাং: ব্যবহার করুন ed, বা জিএনইউ সেড -i, বা sponge, বা একটি বৃহত ফাইল পদ্ধতি
গিলস 'তাই মন্দ হওয়া বন্ধ করুন'

3
আমি প্রায়শই সম্ভাব্য বিভ্রান্তিকর শব্দটি স্থানে নিয়ে ভাবছিলাম , যখন 'সেড' উল্লেখ করার সময়, আমি এটি 'ম্যান সেড'-এ দেখলাম: - ইন-প্লেস [= সুফিক্স]This option specifies that files are to be edited in-place. GNU সেড' একটি অস্থায়ী ফাইল তৈরি করে এটি করে এবং স্ট্যান্ডার্ড আউটপুট না করে এই ফাইলে আউটপুট প্রেরণ করা `... আমি অন্য কোনও 'সেড' সম্পর্কে জানি না তবে স্ট্রিম এডিটর সহ" স্থানে "আপডেট করার রসদ " গণনা "করে না :)
পিটার.ও

2
বেশিরভাগ "ইন-প্লেস" পদ্ধতিগুলি আমার অভিজ্ঞতাতে একটি অস্থায়ী ফাইল ব্যবহার করে।
ফাহিম মিঠা

5

যদি ফাইলটি স্মৃতিতে আরামের সাথে ফিট করে তবে আপনি এটিও ব্যবহার করতে পারেন ed
কমান্ডগুলি sedএকটি উল্লেখযোগ্য পার্থক্যের সাথে উপরেরটির মতো বেশিরভাগ অনুরূপ : আপনাকে অবতরণ ক্রমে মুছে ফেলার জন্য লাইন নম্বর / রেঞ্জের তালিকাটি পাস করতে হবে (সর্বোচ্চ লাইন নং / সর্বনিম্ন একটিতে)) কারণটি হ'ল আপনি যখন মুছে ফেলুন / সন্নিবেশ / বিভক্ত / লাইন যুক্ত করবেন edতখন প্রতিটি সাবকম্যান্ডের পরে পাঠ্য বাফার আপডেট করা হয় আপনি যদি কিছু লাইন মুছে ফেলেন তবে নীচের বাকী রেখাগুলি আর বাফারে একই অবস্থানে থাকবে না যখন পরবর্তী সাবকম্যান্ড কার্যকর করা হয়। সুতরাং আপনি পিছনে 1 শুরু করতে হবে ।
ইন-প্লেস এডিটিং:

ed -s in_file <<IN
45d
20,37d
w
q
IN

অথবা

ed -s in_file <<< $'45d\n20,37d\nw\nq\n'

অথবা

printf '%s\n' 45d 20,37d w q | ed -s in_file

আপনি যদি ফাইলটিতে লেখার পরিবর্তে ফলাফলের আউটপুট মুদ্রণ করতে চান তবে wরিন্টের সাথে ,pরিটটি প্রতিস্থাপন করুন। আপনি যদি মূল ফাইলটি অক্ষত রাখতে চান এবং অন্য কোনও ফাইলে লিখতে চান তবে আপনি নতুন ফাইলের নামটি wআচার সাবকন্ডে পাস করতে পারেন :

ed -s in_file <<IN
78,86d
65d
51d
20,37d
w out_file
q
IN

1 যদি না আপনি প্রতিটি dএলিটের পরে নতুন লাইন সংখ্যা গণনা করতে ইচ্ছুক না হন , যা এই বিশেষ ক্ষেত্রেটির জন্য যথেষ্ট তুচ্ছ (20-30 লাইন মুছে ফেলার পরে, 18 টি লাইন, লাইন 45 লাইন 27 হয়ে যায়) যাতে আপনি চালাতে পারেন:

ed -s in_file <<IN
20,37d
27d
w
q
IN

তবে, যদি আপনাকে একাধিক লাইন নম্বর / রেঞ্জগুলি মুছতে হয়, তবে পিছনে কাজ করা কোনও মস্তিষ্কের নয়।


qকমান্ডটি কি শেষে কার্যকর? আমার ধারণা এটি কোনওভাবেই বেরিয়ে আসে।
টম ফেনেক 26'17

@ টমফেনেক - সমস্ত বাস্তবায়ন কোনওভাবেই প্রস্থান করে না (যদিও বেশিরভাগ ক্ষেত্রেই ... আমি যেখানে থ্রেড নিয়ে আলোচনা করেছি তা আর খুঁজে পাচ্ছি না ...)
ডোন_ক্রিসটি ২:23

1

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

filename = "foo"
f = open(filename, 'r+')                                                                                                                                 
linenums = [1, 3]                                                                                                                                            
s = [y for x, y in enumerate(f) if x not in [line-1 for line in linenums]]                                                                                                                                          
f.seek(0)
f.write(''.join(s))
f.truncate(f.tell())
f.close()

একটি 5 লাইন ফাইল দিয়ে পরীক্ষা করা হয়েছে। Http://pleac.sourceforge.net/pleac_python/fileaccess.html এর ক্রেডিট , বিভাগ "অস্থায়ী ফাইল ব্যতীত জায়গায় একটি ফাইল পরিবর্তন করা" বিভাগটি দেখুন। Https://stackoverflow.com/questions/125703/how-do-i-modify-a-text-file-in-python এও দেখুন

কিছু নোট:

  1. কেউ প্রথমে ফাইল কেটে ফেলতে পারে, তারপরে লেখার পরিবর্তে এটিতে লিখতে পারে, তারপরে উপরের মতো ছাঁটাই করতে পারে। যাইহোক, আমি পাইথন পতাকাটি জানি না যা একজনকে পড়তে দেয় এবং তারপরে একটি কাটা লিখিত লেখা করতে পারে। তবে সম্ভবত আমি কিছু মিস করছি, কারণ ডকুমেন্টটি সমস্ত পরিষ্কার নয়। যা আমার কাছে নিয়ে আসে

  2. কখনও কখনও পাইথন ডক্স সত্যিই স্তন্যপান। Http://docs.python.org/library/function.html# ওপেন দেখুন

    মোডগুলি 'আর +', 'ডাব্লু +' এবং 'এ +' আপডেট করার জন্য ফাইলটি খুলুন (নোট করুন যে 'ডাব্লু +' ফাইলটি ছাঁটাই করে)।

    এটি কি আপনার কাছে কিছু বোঝায়? "আপডেট করার জন্য উন্মুক্ত" কী?

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

  4. এই পদ্ধতির (মেমরিতে ফাইলটি ম্যানিপুলেট করা) ডিস্ক জায়গার জন্য মেমরিকে ব্যবসা করে। কয়েকশ মেগাবাইট পর্যন্ত ফাইলগুলির জন্য কয়েক গিগাবাইট মেমরিযুক্ত মেশিনগুলিতে এটি ঠিক আছে। পাইথন স্ট্রিংগুলি খুব দক্ষতার সাথে পরিচালনা করে না, সুতরাং উদাহরণস্বরূপ সি / সি ++ এ স্যুইচ করলে সামান্য পারফরম্যান্স বাড়বে এবং মেমরির ব্যবহার ব্যাপকভাবে হ্রাস পাবে।


0

আপনি প্রাক্তন মোডে ভিম ব্যবহার করতে পারেন:

ex -sc '20,37d|45d|x' file
  1. d মুছে ফেলা

  2. x সংরক্ষণ করেন এবং বন্ধ করেন

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