টানা সমস্ত নকল মুছুন Delete


13

আমার কাছে এমন একটি ফাইল রয়েছে যা দেখতে এই জাতীয়।

Move to 230.00
Hold
Hold
Hold
Hold
Hold
Hold
Move to 00.00
Hold 
Hold 
Hold 
Hold 
Hold 
FooBar
Hold 
Spam
Hold

আমি এটি দেখতে এটি চাই:

Move to 230.00
Hold
Move to 00.00
Hold 
FooBar
Hold
Spam
Hold

আমি নিশ্চিত যে কোনও উপায় থাকতে হবে যাতে ভিম তাড়াতাড়ি এটি করতে পারে তবে আমি কীভাবে আমার মাথাটি পুরোপুরি গুটিয়ে রাখতে পারি না। এটি কি ম্যাক্রোগুলির শক্তির বাইরে, এবং উইমস্ক্রিপ্টের প্রয়োজন?

এছাড়াও, যদি আমাকে "হোল্ডস" এর প্রতিটি ব্লকে একই ম্যাক্রো প্রয়োগ করতে হয় তবে তা ঠিক আছে। এটি পুরোপুরি ফাইলটি পেতে একটি একক ম্যাক্রো হতে হবে না, যদিও এটি দুর্দান্ত।

উত্তর:


13

আমি মনে করি নিম্নলিখিত কমান্ডটি কাজ করা উচিত:

 :%s/^\(.*\)\(\n\1\)\+$/\1/

ব্যাখ্যা:

আমরা পরিবর্তন করতে পুরো ফাইলের উপর প্রতিকল্পন কমান্ড ব্যবহার patternমধ্যে string:

:%s/pattern/string/

এখানে patternহয় ^\(.*\)\(\n\1\)\+$এবং stringহয় \1

pattern এভাবে ভেঙে যেতে পারে:

^\(subpattern1\)\(subpattern2\)\+$

^এবং $যথাক্রমে লাইনটির শুরু এবং লাইনের শেষের সাথে মেলে।

\(এবং \)ঘেরে দেওয়ার জন্য ব্যবহৃত হয় subpattern1যাতে আমরা পরে বিশেষ নম্বর দ্বারা এটি উল্লেখ করতে পারি \1
এগুলি ঘেরেও ব্যবহৃত হয় subpattern2যাতে আমরা কোয়ানটিফায়ার দিয়ে এটি 1 বা আরও বেশিবার পুনরাবৃত্তি করতে পারি \+

subpattern1হয় .*
.নতুন লাইন ছাড়া কোনো চরিত্র মিলে একটি metacharacter এবং *একটি কোয়ান্টিফায়ার যে শেষ অক্ষর 0, 1 বা একাধিকবার ম্যাচ হয়।
সুতরাং .*কোনও নতুন লাইন থাকা কোনও পাঠ্যের সাথে মেলে।

subpattern2হয় \n\1
\nনতুন লাইন মিলে যায় এবং \1একই পাঠ্য ভিতরে প্রথম মিলে যাওয়া হয়েছিল ম্যাচ \(, \)এখানে যা subpattern1

সুতরাং patternএটি পড়তে পারেন:
লাইনের একটি সূচনা ( ^) এর পরে কোনও নতুন লাইন ( .*) এর পরে কোনও নতুন লাইন ( \n) তারপরে একই পাঠ্য ( \1), দ্বিতীয়টি এক বা একাধিকবার পুনরাবৃত্তি করা হয় ( \+) এবং অবশেষে লাইনের একটি সমাপ্তি ( $)

যেখানেই patternমিলছে (অভিন্ন লাইনের একটি ব্লক), সাবস্টিটিউশন কমান্ড এটির পরিবর্তে stringএখানে যা এখানে রয়েছে \1(ব্লকের প্রথম লাইন)।

আপনি যদি নিজের ফাইলটিতে কোনও পরিবর্তন না করেই কোন লাইনগুলির ব্লকগুলি প্রভাবিত করতে চান তা দেখতে, আপনি hlsearchবিকল্পটি সক্ষম করতে nএবং আদেশের শেষে বিকল্পের পতাকাটি যুক্ত করতে পারেন :

:%s/^\(.*\)\(\n\1\)\+$/\1/n

আরও দানাদার নিয়ন্ত্রণের জন্য, cপরিবর্তে প্রতিস্থাপনের পতাকাটি যুক্ত করে প্রতিটি লাইনের লাইনের পরিবর্তনের পূর্বে আপনি একটি নিশ্চয়তা চাইতে পারেন :

:%s/^\(.*\)\(\n\1\)\+$/\1/c

প্রতিকল্পন কমান্ড পঠিত সম্পর্কে আরো তথ্যের জন্য :help :s,
প্রতিকল্পন পতাকা জন্য :help s_flags,
বিভিন্ন metacharacters এবং quantifiers জন্য পড়া :help pattern-atoms,
এবং জন্য তেজ নিয়মিত এক্সপ্রেশন পড়া এই

সম্পাদনা করুন: ওয়াইল্ডকার্ড কমান্ডের $শেষে একটি যুক্ত করে সমস্যা সমাধান করেছে pattern

এছাড়াও ব্লাডগেইনের একই কমান্ডের একটি সংক্ষিপ্ত এবং আরও পঠনযোগ্য সংস্করণ রয়েছে।


1
নিস; $যদিও আপনার কমান্ড এটিতে একটি প্রয়োজন । অন্যথায় এটি পূর্ববর্তী লাইনে অভিন্ন পাঠ্যের সাথে শুরু হওয়া লাইনের সাহায্যে অপ্রত্যাশিত জিনিসগুলি করবে তবে এতে কিছু অন্যান্য অক্ষর রয়েছে। এছাড়াও নোট করুন যে আপনি যে বেসিক কমান্ডটি দিয়েছেন তা আমার উত্তরটির সাথে কার্যকরভাবে সমান :%!uniq, তবে হাইলাইট এবং নিশ্চিতকরণের পতাকাগুলি দুর্দান্ত।
ওয়াইল্ডকার্ড

আপনি ঠিক বলেছেন, আমি সবেমাত্র পরীক্ষা করে দেখেছি এবং যদি সদৃশ লাইনের মধ্যে একটিতে আলাদা ট্রেলিং অক্ষর থাকে তবে কমান্ডটি প্রত্যাশিত আচরণ করে না। আমি কীভাবে এটি ঠিক করতে জানি না, পরমাণুটি \nলাইনের শেষের সাথে মেলে এবং এটি প্রতিরোধ করা উচিত তবে এটি হয় না। আমি কোনও সাফল্য না দিয়ে $ঠিক পরে যুক্ত করার চেষ্টা করেছি .*। আমি চেষ্টা করে এটি ঠিক করতে যাচ্ছি, তবে আমি না পারলে হয়তো আমার উত্তরটি মুছে ফেলব বা শেষে একটি সতর্কতা যুক্ত করব। এই সমস্যাটি দেখানোর জন্য আপনাকে ধন্যবাদ।
saginaw

1
চেষ্টা করুন:%s/^\(.*\)\(\n\1\)\+$/\1/
ওয়াইল্ডকার্ড

1
আপনার বিবেচনা করা উচিত যে স্ট্রিংয়ের$ শেষের সাথে মিলছে , লাইনের শেষ নয়। এটি প্রযুক্তিগতভাবে সত্য নয় - তবে আপনি যখন কিছু ব্যাতিক্রম বাদে অক্ষরগুলি পরে রাখেন তখন এটি কোনও বিশেষ কিছুর পরিবর্তে আক্ষরিক সাথে মেলে । সুতরাং মাল্টি-লাইন ম্যাচের জন্য ব্যবহার করা আরও ভাল। (দেখুন )$\n:help /$
ওয়াইল্ডকার্ড

আমি মনে করি আপনি ঠিক এখানে আছেন \nতবে রেগেক্সের অভ্যন্তরে যে কোনও জায়গায় ব্যবহার করা যেতে পারে তবে $সম্ভবত কেবলমাত্র শেষদিকে ব্যবহার করা উচিত। কেবল দুজনের মধ্যে পার্থক্য তৈরি করার জন্য, আমি উত্তরটি সম্পাদনা করেছি \nযা একটি নতুন লাইনের সাথে মেলে (যা সহজাতভাবে আপনাকে মনে করে যে এর পরেও কিছু পাঠ্য রয়েছে) যেখানে $লাইনটির শেষের সাথে মেলে (যা আপনাকে মনে করে যে সেখানে কিছুই নেই বামে)।
saginaw

10

নিম্নলিখিত চেষ্টা করুন:

:%s;\v^(.*)(\n\1)+$;\1;

সাগিনোর উত্তর হিসাবে , এটি ভিমের: বিকল্প কমান্ড ব্যবহার করে। যাইহোক, এটি পঠনযোগ্যতা উন্নত করতে অতিরিক্ত কয়েকটি বৈশিষ্ট্যের সুবিধা নিয়েছে:

  1. ভিম আমাদের ব্যাকস্ল্যাশ ( \ ), ডাবল-কোট ( " ), বা পাইপ ( | ) ব্যতীত আমাদের কোনও ম্যাচ / রিপ্লেজ / ফ্ল্যাগের পাঠ্য বিভাজন করতে অন্য কোনও অক্ষরবিহীন এএসসিআইআই অক্ষর ব্যবহার করতে দেয় Here এখানে, আমি সেমিকোলন ( ; ) নির্বাচন করেছি , তবে আপনি পারেন অন্যটি বাছাই কর.
  2. ভিম নিয়মিত অভিব্যক্তিগুলির জন্য "যাদু" সেটিংস সরবরাহ করে, যাতে অক্ষরগুলি ব্যাকস্ল্যাশ পালানোর প্রয়োজনের পরিবর্তে তাদের বিশেষ অর্থগুলির জন্য ব্যাখ্যা করা হয়। এটি ভারবোসিটি হ্রাস করতে সহায়ক এবং কারণ এটি "ন্যামাজিক" ডিফল্টের চেয়ে বেশি সুসংগত। \v"খুব যাদু" বা আলফানিউমেরিক ( A-z0-9 ) এবং আন্ডারস্কোর ( _ ) ব্যতীত সমস্ত অক্ষরের অর্থ দিয়ে শুরু করার বিশেষ অর্থ রয়েছে।

উপাদানগুলির অর্থ:

পুরো ফাইলের জন্য %

s বিকল্প

; বিকল্প স্ট্রিং শুরু করুন

\ v "খুব যাদু"

^ লাইনের শুরুতে

(। *) 0 বা তার বেশি কোনও চরিত্র (গোষ্ঠী 1)

(\ n \ 1) + নিউলাইন এর পরে (গ্রুপ 1 টি ম্যাচের পাঠ্য), 1 বা আরও বেশি বার (গ্রুপ 2)

$ লাইনের শেষে (বা এই ক্ষেত্রে, মনে পরবর্তী অক্ষরে একটি newline হওয়া আবশ্যক )

; স্ট্রিং প্রতিস্থাপন শুরু করুন

Group 1 গ্রুপ 1 ম্যাচের পাঠ্য

; কমান্ড শেষ বা পতাকা শুরু


1
আমি আপনার উত্তরটি সত্যিই পছন্দ করি কারণ এটি আরও পাঠযোগ্য, কারণ এটি আমাকে \nএবং এর মধ্যে পার্থক্যটি আরও ভালভাবে বুঝতে পেরেছিল $\nনিদর্শনটিতে কিছু যুক্ত করে: অক্ষরটি নতুন লাইন যা ভিমকে জানায় যে নিম্নলিখিত পাঠ্যটি একটি নতুন লাইনে রয়েছে। যেখানে $প্যাটার্ন কিছু যোগ করে না, এটি কেবল একটি ম্যাচ যদি প্যাটার্ন পরবর্তী অক্ষরে বাইরে একটি নতুন লাইন নয় তৈরি করা থেকে বিরত রাখে। কমপক্ষে, আপনার উত্তরটি পড়ে এবং আমি এটি বুঝতে পেরেছি :help zero-width
saginaw

এবং একই কথাটি অবশ্যই সত্য হতে হবে ^, এটি প্যাটার্নে কিছু যোগ করে না, প্যাটার্নের বাইরের পূর্ববর্তী অক্ষরটি যদি নতুন লাইন না হয় তবে এটি কেবল একটি ম্যাচ তৈরি করতে বাধা দেয় ...
স্যাগনো

@ সাগিনাউ আপনার ঠিক এটি আছে, এবং এটি একটি ভাল ব্যাখ্যা। নিয়মিত অভিব্যক্তিগুলিতে, কিছু অক্ষর নিয়ন্ত্রণ অক্ষর হিসাবেও হতে পারে । উদাহরণস্বরূপ, এর +অর্থ "পূর্ববর্তী প্রকাশটি (চরিত্র বা গোষ্ঠী) 1 বা ততোধিক বার পুনরাবৃত্তি করুন", তবে কোনও কিছুর সাথে মেলে না। এর ^অর্থ "স্ট্রিংয়ের মাঝখানে শুরু হতে পারে না" এবং এর $অর্থ "স্ট্রিংয়ের মাঝখানে শেষ হতে পারে না।" লক্ষ্য করুন আমি সেখানে "লাইন", তবে "স্ট্রিং" বলিনি। ভিম প্রতিটি লাইনকে ডিফল্টরূপে স্ট্রিং হিসাবে গণ্য করে - এবং \nএটিই এখানে আসে V
ব্লাডগেইন

8

আপনি যদি সমস্ত সংলগ্ন অভিন্ন লাইনগুলি সরাতে চান তবেই নয় Hold, আপনি এটি খুব সহজেই বাইরে থেকে একটি ফিল্টার দিয়ে করতে পারেন vim:

:%!uniq (ইউনিক্স পরিবেশে)।

আপনি যদি এটি সরাসরি করতে চান তবে vimএটি আসলে খুব জটিল। আমি মনে করি একটি উপায় আছে, তবে সাধারণ ক্ষেত্রে এটি 100% কার্যকরী করে তোলা খুব জটিল এবং আমি এখনও সমস্ত বাগ খুঁজে আছি না।

যাইহোক, এই নির্দিষ্ট ক্ষেত্রে, যেহেতু আপনি চাক্ষুষরূপে দেখতে পাচ্ছেন যে নেক্সট-অনুলিপিযুক্ত পরবর্তী লাইনটি একই অক্ষর দিয়ে শুরু হয় না, আপনি ব্যবহার করতে পারেন:

:+,./^[^H]/-d

+বর্তমান লাইন পর লাইন মানে। দ্য . বর্তমান লাইন বোঝায়। /^[^H]/-সামনে (লাইন মানে -) পরের লাইনে যে এইচ শুরু হয় না

তারপরে ডি মুছে ফেলা হয়।


3
বিকল্প এবং গ্লোবাল ভিম কমান্ডগুলি ভাল অনুশীলনগুলির মধ্যে রয়েছে, কল করা uniq(হয় কোনও ভিমের মধ্যে থেকে বা শেল ব্যবহার করে) আমি কীভাবে এটি সমাধান করব। একটি জিনিসের জন্য, আমি নিশ্চিত uniqযে ফাঁকা / সমস্ত স্থান সমান হিসাবে লাইনগুলি হ্যান্ডেল করব (এটি পরীক্ষা করে নি) তবে এটি একটি রেজেক্সের সাথে ধরা খুব শক্ত হবে hard আমি যখন কাজটি করার চেষ্টা করছি তখন এর অর্থ "চাকা পুনরুদ্ধার করা" নয়।
ব্লাডগেইন

2
বাহ্যিক সরঞ্জামগুলির মাধ্যমে পাঠ্য খাওয়ানোর দক্ষতা হ'ল আমি সাধারণত উইন্ডোজে ভিম এবং সাইগউইনকে সুপারিশ করি । তেজ কেবল শেল অন্তর্গত একসঙ্গে।
দেবসোলার

2

একটি ভিম ভিত্তিক উত্তর:

:%s/\(^.*\n\)\1\{1,}/\1

= প্রতিটি লাইন নিজেই অনুসরণ করে কমপক্ষে একবার একই লাইনের সাথে প্রতিস্থাপন করুন ।


2

আরও একটি, ভিম .4.৪.২১৮ বা তার পরে গ্রহণ করে:

function! s:Uniq(line1, line2)
    let cursor = getcurpos()
    let lines = uniq(getline(a:line1, a:line2))
    if setline(a:line1, lines) == 0 && len(lines) <= a:line2 - a:line1
        silent execute (a:line1 + len(lines)) . ',' . a:line2 . 'd _'
    endif
    call setpos('.', cursor)
endfunction

command! -range=% Uniq call <SID>Uniq(<line1>, <line2>)

এটি অন্যান্য সমাধানগুলির চেয়ে অগত্যা ভাল নয়।


2

প্রেবেন গুলবার্গ এবং পিট ডেলপোর্টের পুরাতন (2003) ভিম (গল্ফ) এর ভিত্তিতে একটি সমাধান এখানে দেওয়া হয়েছে ।

  • এর শিকড় আছে %g/^\v(.*)\n\1$/d
  • অন্যান্য সমাধানগুলির বিপরীতে, এটি কোনও ফাংশনে আবদ্ধ করা হয়েছে সুতরাং এটি অনুসন্ধান নিবন্ধকে এবং কোনও নামবিহীন নিবন্ধকে কোনও পরিবর্তন করে না।
  • এটির ব্যবহার সহজ করার জন্য এটি একটি কমান্ডের মধ্যেও অন্তর্ভুক্ত করা হয়েছে:
    • :Uniq(সমতুল্য :%Uniq),
    • :1,Uniq (বাফার শুরু থেকে বর্তমান লাইনে),
    • চাক্ষুষভাবে লাইনগুলি + হিট নির্বাচন করুন :Uniq<cr>(ভিমে এর মধ্যে প্রসারিত :'<,'>Uniq)
    • ইত্যাদি ( :h range)

কোডটি এখানে:

command! -range=% -nargs=0 Uniq <line1>,<line2>call s:EmuleUniq()

function! s:EmuleUniq() range
  let l1 = a:firstline
  let l2 = a:lastline
  if l1 < l2
    " Note the "-" to avoid spilling over the end of the range
    " Note also the use of ":delete", along with the black hole register "_"
    silent exe l1.','l2.'-g/^\(.*\)\n\1$/d _'

    call histdel('search', -1)          " necessary
    " let @/ = histget('search', -1)    " useless within a function
  endif
endfunction

দ্রষ্টব্য: তাদের প্রথম প্রচেষ্টা ছিল:

" Version1 from: Preben 'Peppe' Guldberg <peppe {at} xs4all {dot} nl>
" silent exe l1 . ',' . (l2 - 1) . 's/^\(.*\)\%(\n\%<' . (l2 + 1)
      " \ . 'l\1$\)\+/\1/e'

" Version from: Piet Delport <pjd {at} 303.za {dot} net>
" silent exe l1.','l2.'g/^\%<'.l2.'l\(.*\)\n\1$/d'
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.