মাল্টিলাইন পাঠ্য ফাইলে কোঁকড়ানো বন্ধনীগুলির মধ্যে সমস্ত পাঠ আমি কীভাবে মুছতে পারি?


10

উদাহরণ:

This is {
the multiline
text file }
that wants
{ to be
changed
} anyway.

হওয়া উচিত:

This is 
that wants
 anyway.

আমি ফোরামে কিছু অনুরূপ থ্রেড পেয়েছি , তবে তারা মাল্টি-লাইন কার্ল ব্র্যাকেটগুলির সাথে কাজ করছে বলে মনে হয় না।

যদি সম্ভব হয় তবে আমি কিছু ওয়ান-লাইন পদ্ধতি পছন্দ করবো, যেমন গ্রাইপ, সেড, অ্যাজ ... ইত্যাদি ভিত্তিক সমাধানগুলি prefer

সম্পাদনা: সমাধানগুলি ঠিক আছে বলে মনে হচ্ছে তবে আমি লক্ষ্য করেছি যে আমার মূল ফাইলগুলিতে কোঁকড়ানো বন্ধনী অন্তর্ভুক্ত রয়েছে। তাই আমি একটি নতুন প্রশ্ন খুলছি। আপনাকে সবাইকে ধন্যবাদ: আমি মাল্টলাইন পাঠ্য ফাইলে নেস্টেড কোঁকড়ানো বন্ধনীগুলির মধ্যে সমস্ত পাঠ কীভাবে মুছতে পারি?


1
এটি ব্যবহার করে দেখুনsed '/{/{:1;N;s/{.*}//;T1}' multiline.file
কস্টাস

উত্তর:


10
$ sed ':again;$!N;$!b again; s/{[^}]*}//g' file
This is 
that wants
 anyway.

ব্যাখ্যা:

  • :again;$!N;$!b again;

    এটি পুরো ফাইলটি প্যাটার্ন স্পেসে পড়ে।

    :againএকটি লেবেল Nপরের লাইনে পড়ে। $!b againশাখা ফিরে againশর্তে যে এই শেষ লাইন নয় উপর লেবেল।

  • s/{[^}]*}//g

    এটি বন্ধনীগুলিতে সমস্ত এক্সপ্রেশন সরিয়ে দেয়।

ম্যাক ওএসএক্স-এ চেষ্টা করুন:

sed -e ':again' -e N -e '$!b again' -e 's/{[^}]*}//g' file

নেস্টেড ধনুর্বন্ধনী

প্রচুর নেস্টেড ধনুর্বন্ধনী সহ এটি পরীক্ষা ফাইল হিসাবে নেওয়া যাক:

a{b{c}d}e
1{2
}3{
}
5

নেস্টেড ব্রেসগুলি হ্যান্ডেল করার জন্য এখানে একটি পরিবর্তন রয়েছে:

$ sed ':again;$!N;$!b again; :b; s/{[^{}]*}//g; t b' file2
ae
13
5

ব্যাখ্যা:

  • :again;$!N;$!b again

    এটি আগের মতোই: এটি পুরো ফাইলটিতে পড়ে।

  • :b

    এটি একটি লেবেল সংজ্ঞায়িত করে b

  • s/{[^{}]*}//g

    এটি পাঠ্যগুলি ব্রেসগুলিতে সরিয়ে দেয় যতক্ষণ না পাঠ্যের অভ্যন্তরীণ বন্ধনী থাকে।

  • t b

    উপরের বিকল্প কমান্ডের পরিবর্তনের ফলে, লেবেলে ফিরে যান b। এইভাবে, সমস্ত ব্রেস-গ্রুপগুলি সরিয়ে না দেওয়া পর্যন্ত বিকল্প কমান্ডটি পুনরাবৃত্তি করা হয়।


আপনার উত্তরটি নিখুঁত বলে মনে হচ্ছে। আমি সবেমাত্র যে নতুন প্রশ্নটি খুলেছি (মূল প্রশ্নটি পড়ুন EDIT) ঠিক তেমনটি না হয়, আমি মনে করি এটিরও উত্তর দেওয়া উচিত। ফোরামের নিয়মে এটি কি ঠিক হবে?
সোপালাজো ডি অ্যারিরিজ

@ জন ১০২৪, ওপি যেমন একটি নতুন প্রশ্ন পোস্ট করেছে আপনি নিজের সম্পাদনাটি এখানে সরিয়ে নিতে পারেন ।
রমেশ

1
ঠিক আছে. আমি এটি সেখানে অনুলিপি করেছি এবং নতুন প্রশ্নের নমুনা পাঠ্যটি ব্যবহার করতে এটি সংশোধন করেছি।
1024

5

পার্ল:

perl -0777 -pe 's/{.*?}//sg' file

আপনি যদি জায়গাটিতে সম্পাদনা করতে চান

perl -0777 -i -pe 's/{.*?}//sg' file

এটি ফাইলটি একক স্ট্রিং হিসাবে পড়ে এবং একটি বিশ্বব্যাপী অনুসন্ধান-ও-প্রতিস্থাপন করে।

এটি নেস্টেড ব্রেসড পরিচালনা করবে:

perl -ne 'do {$b++ if $_ eq "{"; print if $b==0; $b-- if $_ eq "}"} for split //'

আপনাকে ধন্যবাদ, এটি খুব সহায়ক ছিল! এটি আমাকে বিল্ড স্ক্রিপ্টের সাথে একটি সমস্যার সমাধান করতে সাহায্য করেছিল যাতে কয়েক মিনিটের মধ্যে অহ..মির সাথে সেডের সাথে লড়াই করে কোনও ফাংশনের বিষয়বস্তু প্রতিস্থাপন করতে পারে, আরও বেশি সময় আমি স্বীকার করব (ঘন্টা..cough..cough)
অ্যান্ড্রুডি

4

SED:

sed '/{/{:1;N;s/{.*}//;T1}' multiline.file

সঙ্গে সঙ্গতিপূর্ণ যেহেতু শুরু {এবং পরবর্তী লাইন (পেতে N) প্রতিকল্পন (যতক্ষণ না {}) তৈরি করা যেতে পারে ( Tমানে দ্বারা তৈরি চিহ্নিত করতে আসতে :যদি প্রতিকল্পন তৈরি হয় না)

যদি অনেকগুলি কার্ল এক লাইনে বন্ধনী থেকে যায় তবে সত্য হিসাবে কিছুটা সংশোধন করুন

sed ':1; s/{[^}]*}// ; /{/ { /}/!N ; b1 }' multiline.file

বন্ধনীর মধ্যে সব চিহ্ন সরান ( [^}]সমান যে প্রতীক exeptright bracket করতে sedলোভী নয়), এবং যদি লাইন থাকা left bracked- এ জুড়েছে পরের লাইনে দিয়ে শুরু করতে যদি সেখানে নেই right bracket

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