এক্সওয়াইয়ের চেয়ে বেশি হলে লাইনটি কীভাবে মুছবেন?


21

উদাহরণস্বরূপ: 2048 অক্ষরের চেয়ে বেশি হলে আমি কীভাবে কোনও লাইন মুছতে পারি?


আপনি কি সেড ব্যবহারের জন্য জেদ করেন? এটি সহজ, উদাহরণস্বরূপ পাইথনে। এবং সন্দেহ নেই পার্ল এমনকি আরও সহজ। যদিও প্রশ্নটি ভয়ঙ্করভাবে সংজ্ঞাযুক্ত নয়। একটি ফাইল অনুলিপি করুন, 2048 এর চেয়ে বেশি দীর্ঘ সমস্ত লাইন মুছে ফেলছেন বা অন্য কিছু?
ফাহিম মিঠা

উত্তর:


22
sed '/^.\{2048\}./d' input.txt > output.txt

3
আমি ভুল বার্তা পেতে sed: 1: "/^.\{2048\}..*/d": RE error: invalid repetition count(s)(Mac OS X এর)
wedi

1
@ উইদী আপনি সম্ভবত বিএসডি সংস্করণের পরিবর্তে ম্যাকের সাহায্যে জিএনইউ সংস্করণ ইনস্টল করতে চান।
ব্রিবু

প্রশ্নটি বলছে "XY এর চেয়ে বেশি হলে (যেমন, 2048 অক্ষর)"। তারপরে এটি অবশ্যই> 2048 হবে এবং => 2048 নয়
এজেসিজি

1
@ আজসিজি, এটি> 2048. লক্ষ্য করুন যে রেগেক্সের শেষের দিকে 2049 তম চরিত্রের সাথে মেলে আরও একটি সময়সীমা রয়েছে।
ফোর্সফেস্ক

@ ফোর্সফেস্ক এবং আপনি এটি "^" কেড়ে নিলে ভাল হয় না? (আপনার কমান্ডের সাহায্যে আপনি কেবল "
এক্সওয়াইজেড

7

এখানে একটি সমাধান যা 2049 বা আরও বেশি অক্ষরযুক্ত লাইনগুলি মুছে দেয়:

sed -E '/.{2049}/d' <file.in >file.out

অভিব্যক্তিটি /.{2049}/dএমন কোনও লাইনের সাথে মিলবে যাতে কমপক্ষে 2049 টি অক্ষর থাকে এবং সেগুলি ইনপুট থেকে মুছে দেয়, কেবলমাত্র আউটপুটে সংক্ষিপ্ত রেখা তৈরি করে।

awkদৈর্ঘ্যের 2048 বা তার চেয়ে কম আকারের মুদ্রণ লাইন সহ :

awk 'length <= 2048' <file.in >file.out

sedআক্ষরিক সহ সমাধানটির নকল করা awk:

awk 'length >= 2049 { next } { print }' <file.in >file.out

1
আমি ভুল বার্তা পেতে sed: 1: "/^.\{400,\}$/d": RE error: invalid repetition count(s)(Mac OS X এর)
wedi

1
@ ওয়েবেই এখন ম্যাকোস মোজভেতে আপডেট হয়েছে এবং পরীক্ষিত হয়েছে।
কুসালানন্দ

2

পাইথনে এর মতো কিছু কাজ করা উচিত।

of = open("orig")
nf = open("new",'w')
for line in of:         
    if len(line) < 2048:
        nf.write(line)
of.close()
nf.close()

1
ব্যক্তিগতভাবে, @ ফাহিম, আমি আপনার উত্তর পছন্দ করি। কারণটি হ'ল আমার পক্ষে এটি 'x এর চেয়ে ছোট সমস্ত লাইন মুছে ফেলা' রূপান্তর করা খুব সহজ ছিল। আমি পাইথনকে সারাক্ষণ ব্যবহার করি না, তবে যখন আমি সর্বদা অনুভব করি তখন আমার এটি ভালভাবে শেখা উচিত।
ixtmixilix

@ixtmixilix: হ্যাঁ, পাইথনের মতো একটি পূর্ণ বৈশিষ্ট্যযুক্ত ভাষা ব্যবহার করা বেশ নমনীয়। মন্তব্যের জন্য ধন্যবাদ.
ফাহিম মিঠা

2
perl -lne "length < 2048 && print" infile > outfile

+1 -lযদিও এর প্রয়োজন নেই।
জোসেফ আর।

আমার জন্য কাজ করে না। পার্ল v5.16.2। Warning: Use of "length" without parentheses is ambiguous at -e line 1. Unterminated <> operator at -e line 1.
wedi

আপনি চেষ্টা করতে পারেন length($_) > 2048 && print। যাইহোক যাইহোক lengthএকটি শর্টকাট length($_)
মারাটসি

0

উপরের উত্তরগুলি ম্যাক ওএস এক্স ১০.৯.৫ এ আমার পক্ষে কাজ করে না।

নিম্নলিখিত কোডটি কাজ করে:

sed '/.\{2048\}/d'

যদিও জিজ্ঞাসা করা হয়নি, তবে রেফারেন্সের জন্য সরবরাহ করা হয়েছে, বিপরীতটি নিম্নলিখিত কোডটি অর্জন করতে পারে:

sed '/.\{2048\}/!d'


লল, তবে sed: 1: "/.\{2048\}/d": RE error: invalid repetition count(s)( Mac OS X, 10.10.4)
অ্যালেক্স ধূসর

আহ। উপরে বিএসডি সংস্করণটির পরিবর্তে আমি জিএনইউ সংস্করণ ইনস্টল করেছি যা উপরোক্ত প্রস্তাবিত @ ফ্রিডম_বেন হিসাবে ম্যাকের সাথে প্রেরণ করে। তবে কুসালানন্দ বর্ধিত রেজেক্স সক্ষম করতে স্যুইচটি পেয়েছিলেন। আপনার যদি এখনও সমস্যাটি থেকে থাকে তবে আপনার তার সমাধান নিয়ে যাওয়া উচিত। ;)
বুড়ি

0

গনু-সেডের সাহায্যে, ব্যাকস্ল্যাশগুলি টাইপ করা এড়াতে এবং একটি কমা দিয়ে একটি খোলা অন্তর সংজ্ঞায়িত করতে আপনি -r পতাকা ব্যবহার করতে পারেন:

sed -r  "/.{2049,}/d" input.txt > output.txt

সঙ্গে:

  • x {2049} যার অর্থ হ'ল 2049 xs
  • x {2049,3072} যার অর্থ 2049 থেকে 3072 xs পর্যন্ত
  • x {2049,} যার অর্থ কমপক্ষে 2049 xs
  • x {, 2049} যার অর্থ 2049 x সেকেন্ডে

অন্তরগুলির জন্য, বড় নিদর্শনগুলির সাথে মেলে না, আপনার পছন্দ মতো লাইন অ্যাঙ্কর প্রয়োজন

sed -r  "/^.{32,64}$/d" input.txt > output.txt 
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.