সমস্ত লাইন একসাথে কোন মিলবে কীভাবে?


12

আমি কেবলমাত্র সেই লাইনের জন্য একসাথে লাইনগুলিতে যোগ দিতে চাই যাগুলির নির্দিষ্ট প্যাটার্ন রয়েছে (যেমন ;) তবে g/;/jএটি ব্যবহার করার সময় যদি দু'বার বলা না হয় তবে এটি প্রত্যাশিত হিসাবে কাজ করে না।

উদাহরণস্বরূপ নিম্নলিখিত বিষয়বস্তু:

a
1;
2;
3;
4;
5;
b
6;
7;
8;
9;
c

ব্যবহার করার সময়: :g/;/jআউটপুটটি হ'ল:

a
1; 2;
3; 4;
5; b
6; 7;
8; 9;
c

বা :g/;/-jদেয়:

a 1; 2; 3; 4; 5;
b 6; 7; 8; 9;
c

সঙ্গে অনুরূপ: :g/;\_.\{-};/j

আমার প্রত্যাশিত ফলাফল:

a 
1; 2; 3; 4; 5;
b
6; 7; 8; 9;
c

বা অনুরূপ কিছু, যাতে প্যাটার্নযুক্ত সমস্ত লাইন একসাথে যুক্ত হয়।

এটি কীভাবে অর্জন করা যায়?


3
FWIW, :g/;/jকাজ করে না কারণ এটি দুটি পাসে করা হয়: প্রথমে বাফারটি স্ক্যান করা হয়, তারপরে কমান্ডটি ম্যাচিং লাইনে প্রয়োগ করা হয়।
রোম্যানেল

উত্তর:


12

সমস্যার সম্ভাব্য ব্যাখ্যা

আমি মনে করি যে :g/;/jকাজ না করার কারণ হ'ল :gআদেশটি 2-পাসের অ্যালগরিদম দিয়ে পরিচালনা করে:

  • প্রথম পাসের সময় এটি প্যাটার্নযুক্ত লাইনগুলি চিহ্নিত করে ;
  • দ্বিতীয় পাসের সময় এটি চিহ্নিত লাইনগুলিতে কাজ করে

দ্বিতীয় পাসের সময়, :gলাইনের 1;সাথে লাইনে যোগ দেয় 2;কারণ 1;প্রথম পাসের সময় চিহ্নিত ছিল। তবে আমার সন্দেহ (নিশ্চিত নয়) যে এটির 1; 2;সাথে যোগ হয় না 3;কারণ লাইনটি 2;আর বিদ্যমান নেই, এর সামগ্রীটি 1;ইতিমধ্যে প্রক্রিয়াভুক্ত হওয়া লাইনের সাথে মিশে গেছে।

সুতরাং :gপরবর্তী পংক্তির সন্ধান করুন যা প্রথম পাসের সময় চিহ্নিত হয়েছিল ( 3;) এবং নিম্নলিখিত একটি ( 4;) এর সাথে এটি যোগ দেয় । এরপর সমস্যা পুনরাবৃত্তি, এটা যোগ দিতে পারবেন না 3; 4;সঙ্গে 5;কারণ লাইন 4;আর বিদ্যমান নেই।

সমাধান 1 (ভিমস্ক্রিপ্ট সহ)

;পূর্ববর্তী লাইনে একটি সেমিকোলন রয়েছে কিনা তা পরীক্ষা করতে আপনি যখনই কোনও ফাংশন কল করতে পারেন :

function! JoinLines()
    if getline(line('.')-1) =~ ';'
        .-1join
    endif
endfunction

তারপরে নিম্নলিখিত গ্লোবাল কমান্ডটি ব্যবহার করুন:

:g/;/call JoinLines()

বা একটি ফাংশন ছাড়াই:

:g/;/if getline(line('.')-1) =~ ';' | -j | endif

সমাধান 2 (বিন্যাস ছাড়াই)

:g/;/.,/^[^;]*$/-1j

যখনই বিশ্বব্যাপী কমান্ড :gপ্যাটার্নটি আবিষ্কার ;করে এটি কমান্ডটি কার্যকর করে: .,/^[^;]*$/-1j

এটি এভাবে ভেঙে যেতে পারে:

:g/pattern/a,bj

কোথায় :

pattern = ;
a       = .           = number of current line
b       = /^[^;]*$/-1 = number of next line without any semicolon minus one

b আরও এভাবে ভেঙে যেতে পারে:

/    = look for the number of the next line matching the following pattern
^    = a beginning of line
[^;] = then any character except a semicolon
 *   = the last character can be repeated 0 or more times
 $   = an end of line
 /   = end of pattern
 -1  = removes one to the number you just got

jপ্রাক্তন কমান্ডের সংক্ষিপ্ত রূপটি :joinযা অন্যান্য প্রাক্তন কমান্ডের মতো একটি রেঞ্জের আগেও করা যেতে পারে।
: এখানে পরিসর পূর্বে এর .,/^[^;]*$/-1( a,b)
একটি পরিসর ফর্ম অনুসরণ a,bযেখানে aএবং bসাধারণভাবে 2 লাইন সংখ্যা আছে, এবং আপনি লাইন যার সংখ্যা মধ্যে একটি গ্রুপ কাজ করতে পারবেন aএবং bপরিবর্তে শুধু একটা।

সুতরাং jকমান্ডটি বর্তমান ( a) এবং পরেরটির মধ্যবর্তী সমস্ত রেখার সাথে মিলিত হয় যার মধ্যে কোন সেমিকোলন বিয়োগ একটি ( b) নেই।

আরও তথ্যের জন্য, দেখুন:

:help :global
:help :join
:help :range

2

আমি বিশ্বব্যাপী অনুসন্ধান এবং প্রতিস্থাপনের সাথে সর্বদা একইভাবে যোগদান করি:

S /; \ N /; /

\n নতুন লাইনের সাথে মেলে।

ফাঁকা লাইনগুলি সন্ধান এবং মুছতে:

S / ^ $ \ N //

আমি নিশ্চিত না কেন তবে আপনি যদি নতুন লাইন ব্যবহার করতে চান তবে .োকাতে চাই \r


sএকা শুধুমাত্র এক লাইন জন্য কাজ করবে, এটা বিশ্বব্যাপী তৈরি করতে আপনি আপনার ব্যবহার করতে হবে %s, কিন্তু তারপর এটা প্রায় সব লাইন যোগাদান করবেন, অ সহ ;লাইন
kenorb

2
@ কোনরব এহম না, আমি মনে করি আপনি :sযা চান ঠিক সেই আদেশটি ব্যবহার করতে পারেন। আমি মনে করি এটি %s/;\n\(.*;\)\@=/;/আপনার প্রয়োজন অনুসারে করে।
ক্রিশ্চিয়ান ব্রাবাঁট 21
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.