আমি ফাইলের একক শব্দের সাথে একাধিক লাইন কীভাবে প্রতিস্থাপন করব (স্থান প্রতিস্থাপন)?


9

আমার filenameফাইলের বিষয়বস্তু নিম্নলিখিত হিসাবে রয়েছে (উদাহরণস্বরূপ):

My block of line starts from here 
START
First line
second line
third line
END
and end to here for example.

আমি কেবলমাত্র একটি শব্দের মধ্যে STARTএবং লাইনগুলির ব্লকটি প্রতিস্থাপন করতে চাই END, উদাহরণস্বরূপ SINGLEWORD। নীচের মত:

My block of line starts from here 
SINGLEWORD
and end to here for example.

এই কমান্ডটি ব্যবহার করে আমি আমার লাইনগুলি ব্লক করতে পারি:

grep -Pzo "START(.|\n)*END" filename

এবং উপরের কমান্ড চালনার ফলাফলটি এরকম হবে:

START
First line
second line
third line
END

তারপরে আমি এই কমান্ডটি সমস্ত লাইনকে একক লাইনে একত্রিত করতে ব্যবহার করেছি:

LAST_RESULT | sed -e :a -e '/$/N; s/\n/ /; ta'

তারপরে আমি এই ফলাফলটি পেয়ে যাব:

START First line second line third line END

এবং আমার শেষ আদেশ দিয়ে LAST_RESULTS | sed 's/.*/SINGLEWORD/'আমি এগুলিতে পরিবর্তন করি "SINGLEWORD"এবং আমি এই ফলাফলটি পাই result

SINGLEWORD

এখন আমি যা চাই তা হল: আমি কীভাবে এই কমান্ডটি (বা আপনার প্রস্তাবনা আদেশ) ব্যবহার করতে পারি এবং আমার লাইনগুলির ব্লককে "সিঙ্গেলওয়ার্ড" শব্দটিতে প্রতিস্থাপন করতে (স্থানে) রাখতে পারি? এবং চূড়ান্ত ফলাফলটি এই ফাইলটির মতো হবে:

My block of line starts from here 
SINGLEWORD
and end to here for example.

উত্তর:


14

এটি খুব সহজেই এখানে করা যায় perl:

$ perl -i -p0e 's/START.*?END/SINGLEWORD/s' file
$ cat file
My block of line starts from here 
SINGLEWORD
and end to here for example. 

ব্যাখ্যা

-0 লাইন বিভাজককে নালায় সেট করে

-p-eপ্রতিটি লাইনে প্রদত্ত স্ক্রিপ্ট প্রয়োগ করুন এবং সেই লাইনটি মুদ্রণ করুন

রিজেক্সপ সংশোধক:

  • /sস্ট্রিংটিকে একক লাইন হিসাবে বিবেচনা করুন। এটি হ'ল, যে .কোনও চরিত্রের সাথে মিলিয়েতে পরিবর্তন করুন , এমনকি একটি নতুন লাইনও, যা সাধারণত এটি মেলে না।

কেন ?:

  • ডিফল্টরূপে, একটি পরিমাণযুক্ত সাবপ্যাটার্নটি হল "লোভী", এটি বাকি প্যাটার্নটি মেলানোর অনুমতি দেওয়ার পরেও এটি যথাসম্ভব বহুবার মিলবে (নির্দিষ্ট শুরুর অবস্থান দেওয়া হয়েছে) still আপনি যদি এটির চেয়ে সর্বনিম্ন সংখ্যার সাথে মিল রাখতে চান তবে কোয়ান্টিফায়ারকে a এর সাথে অনুসরণ করুন ?

@ ক্যাসিএ: ব্যবহার sedকরা সম্ভব হওয়া উচিত তবে পড়ার চেয়ে আরও কঠিন (এই প্রশ্নটি দেখুন )
সিলভাইন পাইনাউ

আরও একটি কারণ আমার শুরু এবং শেষের প্যাটার্ন বিশেষ অক্ষর (হয়েছে /, *, ?তাতে) এবং এই মাত্র উদাহরণ। এবং আপনি আপনার আদেশ ব্যাখ্যা করতে পারে।
нιη

@KasiyA আপনার সাথে \ যেমন অক্ষর অব্যাহতি করতে পারেন (ঠিক মত sed): \/, \*,\?
সিলভাঁ Pineau

@ কাসিয়া আমি চেষ্টা করেছি perl -i -p0e 's/\/\*.*?\*\//SINGLEWORD/sm'। এটি কাজ করা উচিত
সিলভাইন পাইনাউ

@ ক্যাসিয়া আমার মনে হয় আমি এখন ব্যাখ্যা দিয়ে শেষ করেছি;)
সিলভাইন পাইনাউ

14

আমি ভাবছিলাম যে এটি ছাড়া কী সম্ভব perl, pythonএবং অন্যরাও। এবং আমি এই সমাধানটি ব্যবহার করে পেয়েছি sed:

$ sed ':a;N;$!ba;s/START.*END/SINGLEWORD/g' filename

ব্যাখ্যা:

  1. : একটি 'একটি' লেবেল তৈরি
  2. প্যাটার্ন স্পেসে এন পরের লাইনটি যুক্ত করুন
  3. $! না শেষ লাইনটি যদি , বিএ শাখা ট্যাগ 'একটি' (যান)
  4. এর বিকল্প , /START.*END/দ্বারা SINGLEWORD, / জি গ্লোবাল ম্যাচ (যতবার সম্ভব)

এটি এখানে পাওয়া গেছে

@ কাসিয়া, ধন্যবাদ আমি অনেক আকর্ষণীয় জিনিস শিখেছি!

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