একই লাইনের শেষে প্রতিটি লাইনের প্রথম চারটি অক্ষর কীভাবে অনুলিপি করবেন?


10

এর মতো দেখতে দেখতে এমন একটি সিরিজ দেওয়া হয়েছে:

2001 "Some Kind of Title," Author's Name, Publication Name, 1 Mar.
2002 "Some Kind of Title," Author's Name, Publication Name, 12 Oct.
2003 "Some Kind of Title," Author's Name, Publication Name, 8 Apr.
2004 "Some Kind of Title," Author's Name, Publication Name, 3 Jun.

এমন কোনও উপায় আছে যা আমি প্রথম চারটি অক্ষর (বছর) ধরে ফেলতে পারি এবং লাইনটির শেষে তাদের অনুলিপি করতে পারি, যাতে এটি দেখতে দেখতে:

2001 "Some Kind of Title," Author's Name, Publication Name, 1 Mar. 2001
2002 "Some Kind of Title," Author's Name, Publication Name, 12 Oct. 2002
2003 "Some Kind of Title," Author's Name, Publication Name, 8 Apr. 2003
2004 "Some Kind of Title," Author's Name, Publication Name, 3 Jun. 2004

7
নিশ্চিত থাকে: :%g/^\d\{4}\d\@!/s/^\(\d\{4}\).*\zs/ \1/
সাতো কাতসুরা

উত্তর:


17
:% s/\v^(\d{4})(.*)$/\1\2 \1/ 

এটি করার এক উপায়

  • \v জাদু বিকল্প, গ্রুপিং এড়ানো এড়াতে ()
  • ^ লাইনের শুরু
  • \d{4} ঠিক চার অঙ্কের সাথে মেলে
  • .* লাইনের বাকি
  • \1 \2 মধ্যে মেলে প্যাটার্ন ()

সম্পাদনা করুন: @ জায়ের লোপেজ মন্তব্যগুলিতে উল্লেখ করেছেন, নিয়মিত প্রকাশটি আরও উন্নত করা যেতে পারে:

:% s/\v^(\d{4}).*/& \1/ 

বা সমতুল্য

:% s/\v^(\d{4}).*/\0 \1/ 
  • &এবং \0সম্পূর্ণ মেলে নিদর্শন রয়েছে

আরও পড়ার জন্য, ভিমারেজেক্স এবং রেজেেক্স এফএকিউ


3
:%s/\v^(\d{4}).*/& \1/একটি সংক্ষিপ্ত কমান্ড হবে।
জাইর লোপেজ

10

এবং একটি ম্যাক্রো সহ একটি সমাধান:

qqyiwA <Esc>pj0q

যার অর্থ:

qq   Record the macro in the register q
yiw  Yank the text described by the text object iw (inner word): The date
A <Esc>   Append a white space to the end of the line and go back to insert mode
p    Paste the date
j0   Place your cursor on the first column of the next line (to be able to repeat the macro)
q    Stop recording

আপনি ম্যাক্রোর সাথে যতটা সময় লাইনে রেখেছেন ততবার পুনরায় খেলতে পারবেন 3@a

সম্পাদনা হিসাবে @evilsoup মন্তব্য এটা উল্লেখ করা হয়েছে, বাফার সব লাইন ম্যাক্রো চালানো আরো একটি কার্যকর উপায় ব্যবহার করতে হয়:

:%normal @q

আপনি অবশ্যই সংশোধন করার জন্য লাইনগুলি বর্ণনা %করে এমন একটি পরিসীমা দ্বারা প্রতিস্থাপন করতে পারেন ।


3
আপনি এটিকে প্রতিটি লাইনেই এক্সিকিউটিভ করতে পারেন:%normal @q
অ্যাসসপ্প

@ ইভিলসপ: উল্লেখ করার জন্য ধন্যবাদ, আমি উত্তরটি সম্পাদনা করব।
স্ট্যাটক্স

6

আমি এখানে এটি করার উপায়:

:%norm y4lA <C-o>p

ব্যাখ্যা:

:%norm                     "Apply the following keystrokes to every line:
       y4l                 "Yank 4 letters. You could also do 'yiw'
          A                "Add a space to the end
            <C-o>          "Do a single normal command
                 p         "Paste

4

আপনার যদি মানক ইউনিক্স কমান্ডের অ্যাক্সেস থাকে তবে আপনি এটি ব্যবহার করতে পারেন AWK:

:%!awk '{print $0" "$1}'

সত্যই vi / vim নয়, তবে, বা প্রথম চারটি অক্ষর।
পাইপ

1
বিবেচনা :help filterএকটি বিল্ট-ইন তেজ বৈশিষ্ট্য এবং কত ভাল যে বৈশিষ্ট্যটি তেজ ইউনিক্স দৃষ্টান্ত মাপসই করার অনুমতি দেয় আমি, এটা খুবই VI / তেজ এর বলতেন আসলে বিবেচনা।
রোমেনেল

1

আমি মনে করি এটি করার জন্য বিদ্যমান ব্যবস্থাগুলি আরও ভাল তবে ভিজ্যুয়াল ব্লক মোড ব্যবহার করে এটি করাও সম্ভব ।

তারিখগুলি অনুলিপি করুন:

gg          # Go to the top of the file
<ctrl>y     # Enter visual block mode
G           # Go to the bottom of the file
w           # Select the first word
"jy         # Copy in to the j register

প্রথম লাইনের শেষে প্যাড করুন:

gg      # Top of file
A       # Append the line
        # Some spaces
<ESC>   # Return to command mode

আটকান:

gg 
# Move right to the length of the longest line
"jp   # Paste the block

নোট করুন যে আপনি কেবল এর 4lপরিবর্তে করতে পারেনllll
এভারগ্রিন

@ এভারগ্রিনট্রি - আপডেট হয়েছে।
ষাট ফুটারসুডে

0

ইউনিক্স কমান্ড লাইন থেকে (বা উইন্ডোজ যদি আপনার ইউনিক্স কমান্ড লাইন সরঞ্জাম ইনস্টল থাকে)

sed -e "s/\(....\)\(.*\)/\1\2 \1" < inputFile > outputFile
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.