নিয়মিত এক্সপ্রেশন ব্যবহার করে সন্ধান করুন এবং প্রতিস্থাপন করুন


26

আমার কাছে একগুচ্ছ ব্যবহারকারীর ডিফল্ট ফাইল রয়েছে I নিম্নলিখিত উদাহরণ ব্যবহার করে:

###############################################################################
# Trackpad, mouse, keyboard, Bluetooth accessories, and input                 #
###############################################################################

# Trackpad: enable tap to click for this user and for the login screen
defaults write com.apple.driver.AppleBluetoothMultitouch.trackpad Clicking -bool true

আমি প্রতিস্থাপন করতে চাই # Trackpad: ...সঙ্গেrunning "Trackpad: ..."

সমস্যাটি ভেঙে, আমি একটি রেজেক্স পরীক্ষক ব্যবহার করে কিছু নিয়ে এসেছি:

/\n\n#\s(.*)/g

আমি যদি এটি ভিমে চেষ্টা করে দেখি তবে এটি আমার পক্ষে কার্যকর হয় না:

:/\n\n#\s(.*)/running "\1"/g

আমার ধারণা আমার সমস্যাটি দুটি নির্দিষ্ট প্রশ্নে ফুটে উঠেছে:

  1. আমি কীভাবে \nঅক্ষরগুলি অনুসন্ধান করা এড়াতে পারি এবং তার পরিবর্তে #অনুসন্ধান গোষ্ঠীর শেষে উপস্থিত না হওয়া নিশ্চিত করে তুলতে পারি ?
  2. আমি কীভাবে ক্যাপচার গ্রুপগুলি কার্যকরভাবে ব্যবহার করতে পারি?

নীচে কিছু দুর্দান্ত উত্তর আছে। তিনটির মধ্যেই বেছে নেওয়া শক্ত, তবে আমি অনুভব করি যে নির্বাচিত উত্তরটি আমার মূল অনুমানের জন্য সবচেয়ে সঠিক। আপনি তাদের সম্পর্কে আপনার কেমন অনুভূতি রয়েছে তা দেখার জন্য আপনাকে প্রকৃত ফাইল সহ তিনটি উত্তর চেষ্টা করার পরামর্শ দিচ্ছি ।

উত্তর:


18

কেবল পরিষ্কার করে বলতে ... আমি বিশ্বাস করি আপনি কি প্রতিস্থাপনের ফলাফল হিসাবে এটি চেয়েছিলেন?

###############################################################################
# Trackpad, mouse, keyboard, Bluetooth accessories, and input                 #
###############################################################################

running "Trackpad: enable tap to click for this user and for the login screen"
defaults write com.apple.driver.AppleBluetoothMultitouch.trackpad Clicking -bool true

সেক্ষেত্রে আমি নিম্নলিখিত আদেশটি সুপারিশ করছি:

:%s/\n\n#\s\+\(.*\)/^M^Mrunning "\1"/

প্যাটার্নের ব্যাখ্যা

:s/PATTERN/REPLACEMENT/হয় বিকল্প কমান্ড। শতাংশ সাইন ইন :%sএটি কেবলমাত্র বর্তমান লাইনের পরিবর্তে পুরো ফাইলটিতে কাজ করে।

\n\nবলছেন যে সুদ লাইন একটি ফাঁকা লাইন পরে ঘটবে উচিত নয়। আপনি যদি পূর্ববর্তী ফাঁকা রেখা সম্পর্কে চিন্তা না করেন ^তবে যথেষ্ট হবে।

#\s\+এক বা একাধিক সাদা স্থানের অক্ষরগুলির পরে একটি হ্যাশ চরিত্রের সাথে মেলে। \(.*\)লাইনের পরবর্তী সমস্ত পাঠ্য ক্যাপচার করে।

প্রতিস্থাপন পাঠ্যের ব্যাখ্যা

^M^M\n\nযে প্যাটার্নটিতে উপস্থিত ছিল তা প্রতিস্থাপন করতে দুটি রেখার সন্নিবেশ করান । অন্যথায়, পাঠ্যটি ফাঁকা রেখার আগের লাইনের শেষে চলে যাবে। প্রতিটি টাইপ করতে ^Mটিপুন Ctrl-V Ctrl-M

তারপরে, স্ট্রিংটি running, োকান , তারপরে ডাবল-কোটের মধ্যে প্রথম বন্ধনীতে যা ক্যাপচার করা হয়েছিল তা অনুসরণ করুন।


আমি আপনার উত্তর সম্পাদনা করতে অক্ষম তবে আমি বিশ্বাস করি আপনি বোঝাতে চেয়েছিলেন :%s/\v\n\n#\s+(.*)/^M^Mrunning "\1"/("যাদু" পতাকাটি যুক্ত করেছেন)। আমার আসল প্রশ্নের সঠিক উত্তর চয়ন করা সত্যিই কঠিন, তবে আমি অনুভব করি যে উত্তরটি আমার আসল প্রত্যাশিত উত্তরের নিকটতম। এটি কেবলমাত্র একমাত্র যা কোনও পরিসীমা নির্বাচনের প্রয়োজন ছাড়াই পুরো ফাইল জুড়ে কাজ করে।
স্কয়ারফ্রোগ

1
আইআইআরসি আপনি নতুন লাইন পাওয়ার \rপরিবর্তে ব্যবহার করতে পারবেন ^M?
মারু

11

আমি এরকম কিছু ব্যবহার করব:

:s/^#\s\+\(.\{-}\):/running "\1":/
  • ^##লাইনের শুরুতে নোঙ্গর করা চরিত্রটির সাথে মেলে (এই প্রশ্নের উত্তর 1)
  • \s\+ যে কোনও সাদা স্থান এক বা একাধিকবার মেলাতে
  • \( একটি গোষ্ঠী শুরু করতে (এই প্রশ্নের উত্তর 2)
  • .\{-}\লোভী উপায়ে কোনও চরিত্রের সাথে 0 বা একাধিকবার মেলাতে ; এটি এর চেয়ে পৃথক .*যে এটি যতটা সম্ভব সামান্য মিলানোর চেষ্টা করে এবং যতটা সম্ভব সম্ভব না। :কেন বিষয়টি গুরুত্বপূর্ণ তা দেখার জন্য মন্তব্যে একটি চরিত্র যুক্ত করার চেষ্টা করুন
  • \) উপগোষ্ঠী শেষ করতে।
  • : একটি আক্ষরিক সাথে মেলে :

এরপরে আমরা এটি আপনার পাঠ্যের সাথে প্রতিস্থাপন করব এবং \1আমরা ক্যাপচার করা গোষ্ঠীটি উল্লেখ করতে ব্যবহার করব।

আমি একটি রেজেক্স পরীক্ষক ব্যবহার করে কিছু নিয়ে এসেছি

নিয়মিত এক্সপ্রেশন সিনট্যাক্সটি উইকি সিনট্যাক্সের মতো কিছুটা: এগুলির একটি গুচ্ছ রয়েছে, তারা সকলেই এক নজরে একরকম দেখায়, এগুলির কোনওটি স্পষ্টতই অন্য কোনওটির চেয়ে ভাল নয়, তবে অনেকগুলি পার্থক্য রয়েছে।

আজ, তথাকথিত "পার্ল সামঞ্জস্যপূর্ণ" নিয়মিত প্রকাশগুলি বেশিরভাগ ভাষায় ডি-ফ্যাক্টো ডিফল্ট, তবে ভিম নিয়মিত প্রকাশগুলি পার্ল-সামঞ্জস্যপূর্ণ এক্সপ্রেশনগুলির সাথে সামঞ্জস্য নয় ! ভিম রেজিপ্সেক্স সিনট্যাক্স কমপক্ষে '70 এর দশকে ফিরে যায়, যখন পার্ল এমনকি ছিল না।

আপনি এটি সাবগ্রুপগুলির সাথে দেখতে পাবেন, যেখানে আপনাকে ব্যবহার করতে হবে \(এবং না ((এটি পসিক্স 'বেসিক' সিনট্যাক্সের সাথে সামঞ্জস্যপূর্ণ, তবে আরও সাধারণ পসিক্স 'এক্সটেন্ডেড' সিনট্যাক্স বা পার্ল সিনট্যাক্সের সাথে নয়)। আপনি \vকোনও নিদর্শনতে পতাকাটি যুক্ত করে এটি নিয়ন্ত্রণ করতে পারেন ( :help /\vবিশদটি দেখুন ), এটি এটি "আরও সামঞ্জস্যপূর্ণ" করে তুলবে, তবে সম্পূর্ণ নয় ( .{-}উদাহরণস্বরূপ আপনাকে এখনও লোভী মিলগুলির জন্য ব্যবহার করতে হবে )

সুতরাং এটি ব্যাখ্যা করতে পারে কেন "রিজেক্স টেস্টার" ব্যবহার করা প্রায় কাজ করে তবে বেশ কার্যকর নয় works

http://www.vimregex.com/ একটি ভাল সংক্ষিপ্ত বিবরণ হিসাবে / Vim regexps এর চিটশিট হিসাবে।


1
দুর্দান্ত উত্তর, বিশেষত কেন রেজেক্সের সাথে! = রেজেক্স। আপনার অনুসন্ধান এবং প্রতিস্থাপনের জন্য, মন্তব্যটি হতে পারে বা নাও থাকতে পারে এটি কিছুটা জটিল :। জন্য বিবরণ পূর্ণ ফাইলটি দেখুন github.com/squarefrog/dotfiles/blob/master/osx/...
squarefrog

8

আপনি পারেন:

  • শেষ না হওয়া লাইনের জন্য অনুসন্ধান করুন #::/[^#]$/
  • #\s(.*)লাইনের শুরুতে প্রতিস্থাপন করুন :s/\v^#\s(.*)/running "\1"/

গোষ্ঠী ব্যবহার করতে, আপনার প্রয়োজন হয়:

  • বন্ধনীগুলি এড়িয়ে চলুন যাতে তারা রেজেক্স সিনট্যাক্সের অংশ হয়: \(.*\)বা
  • "যাদু" ব্যবহার করে এর সাথে অভিব্যক্তিটি শুরু করুন \v:s/\v...

এটি একত্রিত:

:/[^#]$/s/\v^#\s(.*)/running "\1"/

1
ট্যাগগুলি কী লিখতে হবে তার পরিবর্তে ট্যাগগুলির অর্থ ব্যাখ্যা করার জন্য এটি দুর্দান্তভাবে কাজ করে।
স্কয়ারফ্রোগ

এটি পরিষ্কার করার জন্য ধন্যবাদ যে রেজেেক্স সিনট্যাক্সের অংশ হওয়ার জন্য বন্ধনীগুলি এড়িয়ে যেতে হবে। রেগেক্স গ্রুপগুলির কাজ করার ক্ষেত্রে আমার সর্বদা একটি সমস্যা ছিল।
অ্যাডামা
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.