প্রচুর লাইনযুক্ত একটি ফাইলে আমি শুরু হওয়া লাইনগুলি মুছতে চাই HERE IT IS
।
আমি কীভাবে কেবল কমান্ড-লাইন সরঞ্জাম ব্যবহার করে এটি করতে পারি?
প্রচুর লাইনযুক্ত একটি ফাইলে আমি শুরু হওয়া লাইনগুলি মুছতে চাই HERE IT IS
।
আমি কীভাবে কেবল কমান্ড-লাইন সরঞ্জাম ব্যবহার করে এটি করতে পারি?
উত্তর:
চেষ্টা করুন sed
:
sed -i '/^HERE IT IS/d' <file>
সতর্কতা: এর -i
স্যুইচটি ব্যবহার করার সময় ব্যাকআপ নেওয়া ভাল sed
:
sed -i.bak '/^HERE IT IS/d' <file>
মূল ফাইলটি হিসাবে থাকবে <file>.bak
এবং পরিবর্তিত ফাইলটি থাকবে <file>
।
sed -i 's/^HERE IT IS/HERE IT IS\n/' <file>
sed '/^HERE IT IS/G' file
।
আপনি পেয়েছেন খুব ভাল grep
এবং sed
উত্তর ছাড়াও , এখানে কিছু অন্যান্য সরঞ্জাম যা একই জিনিস করতে পারে:
কয়েকটি পার্ল উপায়:
perl -ne '/^HERE IT IS/ || print' file > newfile
perl -ne 'print if !/^HERE IT IS/' file > newfile
perl -ne 'print unless /^HERE IT IS/' file > newfile
-i
ফাইলটি জায়গায় জায়গায় সম্পাদনা করতে আপনি যে কোনও উদাহরণে স্যুইচ যুক্ত করতে পারেন:
perl -i.bak -ne '/^HERE IT IS/ || print' file
(ছ) awk
awk '!/^HERE IT IS/' file > newfile
জিএনইউ awk
(নতুন awk
লিনাক্সের উপর পূর্বনির্ধারিত ) এর নতুন সংস্করণগুলি (৪.১.১ এবং তার পরে) ফাইলটি জায়গায় জায়গায় সম্পাদনা করতে পারে:
gawk -i inplace '!/^HERE IT IS/' file
শেল ( bash
, zsh
, ksh
, সম্ভবত অন্যদের)। এটি যদিও নির্বোধ ধরনের, এটি করা যেতে পারে তবে অন্যান্য সরঞ্জামগুলি আরও ভাল।
while IFS= read -r line; do
[[ $line =~ ^"HERE IT IS" ]] || printf "%s\n" "$line"
done < file > newfile
bash
একজন আমাকে এলওএল বানিয়েছে)
printf "%s\n" "$line"
: সাদা স্পেসগুলি সংরক্ষণ করার জন্য $ লাইনটি উদ্ধৃত করা এবং কিছু প্রতিধ্বনি সমস্যাগুলি এড়ানো (বিশেষ চরগুলি ব্যাখ্যা করা ইত্যাদি)। এবং --
খুব যুক্ত করার প্রয়োজন এড়ায় ।
IFS=
এবং -r
, আমি পাশাপাশি সমস্ত পথে যেতে এবং এটি শক্তিশালী করে তুলতে পারি।
sed
অবশ্যই যেতে হবে।
@ হেইমাইল কমান্ডের এই সামান্য পরিবর্তনটি প্যাটার্ন রেফারেন্সে আই এর কারণে একই ক্ষেত্রে ব্যবহৃত হয়েছে কিনা তা লাইনটি মুছে ফেলবে।
sed -i '/HERE IT IS/Id' <file>
আপনি যদি কোনও ডিরেক্টরিতে এটি করতে চেয়েছিলেন এমন কয়েকটি ফাইল থাকে তবে আপনি এটির মতো সন্ধানের সাথে এটি একত্রিত করতে পারেন।
find . -maxdepth 1 -type f -exec sed -i.bak '/HERE IT IS/Id' {} +
ম্যাক্সডেপথ বিকল্পটির অর্থ এটি ডিরেক্টরিতে পুনরাবৃত্তি হবে না।
আর একটি অজগর বিকল্প:
#!/usr/bin/env python3
[print(l, end = "") for l in open(f).readlines() if not l.startswith("HERE IT IS")]
যেখানে f ফাইলের পথ, উদ্ধৃতিগুলির মধ্যে রয়েছে।
grep
grep -P '^(?!HERE IT IS)' file
(?!HERE IT IS)
নেতিবাচক লুক হেড স্টেরিসন যা রেজেক্স ইঞ্জিনটিকে সমস্ত রেখার প্রারম্ভের সীমানা ( যা সাধারণত মিলিত হয়^
) সাথে মিলিয়ে তোলে তবেই যদি স্ট্রিংটি অনুসরণ না করা হয়HERE IT IS
পাইথন
#!/usr/bin/python3
import sys
fil = sys.argv[1]
with open(fil) as f:
for line in f:
if not line.startswith('HERE IT IS'):
print(line, end="")
স্ক্রিপ্টটি কোনও ফাইলে সংরক্ষণ করুন, বলুন script.py
এবং তারপরে টার্মিনালের নীচের কমান্ডের মাধ্যমে এটি চালান।
python3 script.py infile
[print(l, end = "") for l in open(fil).readlines() if not re.match("HERE IT IS", l)]
, তবে এটি এর চেয়ে বেশি দক্ষ নয় startswith
। আমি ভাবলাম কীভাবে [print(l, end = "") for l in open(f).readlines() if not l.startswith("HERE IT IS")]
কোনও তালিকায় আউটপুট তৈরি হবে না।
আপনি প্রাক্তন মোডে ভিম ব্যবহার করতে পারেন:
ex -sc 'g/^HERE IT IS/d' -cx file
g
গ্লোবাল অনুসন্ধান
d
মুছে ফেলা
x
সংরক্ষণ করেন এবং বন্ধ করেন
vim
যেমনটি ব্যবহার করতে পারেনvim '+g/^HERE IT IS/d' +wq test.txt