সর্বশেষ মন্তব্য করা লাইন থেকে 'ফু' দিয়ে রেখার লাইনটি মন্তব্য করুন


12

একটি পাঠ্য ফাইল বিবেচনা করুন users.txt:

#alice
#bob
charlie
dotan
eric

আমাকে সর্বশেষ মন্তব্য করা লাইন থেকে (অন্তর্ভুক্ত) অবধি সমস্ত মন্তব্য করতে হবে dotan। এটি ফলাফল:

#alice
#bob
#charlie
#dotan
eric

এটি sedকরার জন্য কি কোনও দুর্দান্ত অনলাইনার আছে? আমি sedসত্যই না , যে কোনও সরঞ্জাম দিয়ে খুশি হব ।

বর্তমানে আমি সর্বশেষ মন্তব্য করা লাইনের লাইন নম্বর পাচ্ছি:

$ cat -n users.txt | grep '#' | tail -n1
  2 #bob

আমি তারপরে একটি যুক্ত করব এবং এর সাথে মন্তব্য করব sed:

$ sed -i'' '3,/dotan/ s/^/#/' users.txt

আমি জানি যে আমি চালাক হতে পারি এবং কিছুকে একদম bcকুরুচিপূর্ণ এক-লাইনারে একসাথে রাখতে পারি । অবশ্যই একটি পরিষ্কার উপায় আছে?

উত্তর:


5

কেমন

perl -pe '$n=1 if s/^dotan/#$&/; s/^[^#]/#$&/ unless $n==1;' file

বা, একই ধারণা অবাস্তব:

awk '(/^dotan/){a=1; sub(/^/,"#",$1)} (a!=1 && $1!~/^#/){sub(/^/,"#",$1);}1; ' file

7

যদি বিদ্যমান মন্তব্যকৃত রেখাগুলি একটি একক স্বাচ্ছন্দ্যের ব্লক তৈরি করে, তবে আপনি পরিবর্তে প্রথম মন্তব্য করা লাইন থেকে মেল করতে পারেন , কেবলমাত্র সেই লাইনগুলিতেই মন্তব্য-আউট করতে পারেন এবং ইতিমধ্যে মন্তব্য করা হয়নি এমন আপনার শেষ প্যাটার্নটিও অন্তর্ভুক্ত রয়েছে including

sed '/^#/,/dotan/ s/^[^#]/#&/' file

যদি বিদ্যমান মন্তব্যগুলি সামঞ্জস্যপূর্ণ না হয় তবে সেড রেঞ্জের ম্যাচের লোভী প্রকৃতির কারণে আমি মনে করি আপনার মতো কিছু করা দরকার

tac file | sed '/dotan/,/^#/ s/^[^#]/#&/' | tac

অর্থাত্ শেষ প্যাটার্ন থেকে 'প্রথম' মন্তব্যে উপরের দিকে মেলে - স্পষ্টতই এটি এতটা সুবিধাজনক নয় যদি আপনি কোনও স্থানের সমাধান চান তবে।


4

আপনি উভয় কেস (একক অনুরোধের সাথে একক সংলগ্ন ব্লকের মন্তব্যযুক্ত রেখাগুলি বা সংক্ষিপ্ত লাইনের মধ্যে ছেদ করা) পরিচালনা করতে পারবেন sed:

sed '1,/PATTERN/{/^#/{x;1d;b};//!{H;/PATTERN/!{1h;d};//{x;s/\n/&#/g}}}' infile

এটি 1,/PATTERN/পরিসীমাটিতে কেবল রেখাগুলি প্রসেস করে । এটি xস্থান পরিবর্তন ডাবলু পরিবর্তন করে। প্যাটার্ন স্পেস প্রতিবার যখন একটি লাইন মন্তব্য করা হয় (সুতরাং হোল্ড বাফারে একাধিক মন্তব্য করা লাইনের বেশি কখনও পাওয়া যায় না) এবং Hপুরানো জায়গাতে মন্তব্য করা হয়নি এমন প্রতিটি লাইন সংযোজন করা হয় (যখন প্রথম লাইনে থাকে 1dএবং যথাক্রমে 1hপ্রাথমিকটি সরাতেও প্রয়োজনীয় হয় হোল্ড বাফারে খালি লাইন)।
এটি যখন PATTERN এর সাথে মিলিত লাইনে পৌঁছায়, এটি এটিকে Hপুরানো বাফারে যুক্ত করে, xবাফারগুলি পরিবর্তন করে এবং তারপরে \nপ্যাটার্ন স্পেসের প্রতিটি ewline অক্ষরকে একটি \newline এবং a দিয়ে প্রতিস্থাপন করে #(অর্থাৎ, প্যাটার্ন স্পেসের সমস্ত লাইন এখনই শুরু হবে #, হোল্ড স্পেসের প্রথম লাইন হিসাবে প্রথম লাইন সহ সর্বদা একটি মন্তব্য করা রেখা)।
একটি নমুনা সহ infile:

alice
#bob
bill
#charlie
ding
dong
dotan
jimmy
#garry

চলমান:

sed '1,/dotan/{                   # if line is in this range    -start c1
/^#/{                             # if line is commented        -start c2
x                                 # exchage hold space w. pattern space
1d                                # if 1st line, delete pattern space
b                                 # branch to end of script
}                                 #                             -end c2
//!{                              # if line is not commented    -start c3
H                                 # append to hold space
/dotan/!{                         # if line doesn't match dotan -start c4
1h                                # if 1st line, overwrite hold space
d                                 # delete pattern space
}                                 #                             -end c4
//{                               # if line matches dotan       -start c5
x                                 # exchage hold space w. pattern space
s/\n/&#/g                         # add # after each newline character
}                                 #                             -end c5
}                                 #                             -end c3
}' infile                         #                             -end c1

আউটপুট:

alice
#bob
bill
#charlie
#ding
#dong
#dotan
jimmy
#garry

সুতরাং এটি (এবং বাদ দিয়ে) #charlieপর্যন্ত (এবং সহ) কেবলমাত্র লাইনগুলিতে মন্তব্য করে এবং dotanঅন্যান্য লাইনগুলি অচ্ছুত রেখে দেয়।
অবশ্যই, এটি ধরে নিয়েছে যে লাইন মিলের আগে কমপক্ষে একটি কমেন্টে মন্তব্য করা লাইন রয়েছে PATTERN। যদি এটি না হয় তবে আপনি প্রতিস্থাপনের আগে একটি অতিরিক্ত চেক যোগ করতে পারেন:/^#/{s/\n/&#/g}


ধন্যবাদ, এই উত্তরটি থেকে আমার কিছুটা শিখতে হবে!
দোটানকোহেন

চুপ কর, আমার নিশ্চয়ই ভুল হয়েছে। এটি মন্তব্য করা লাইনের শেষ সিরিজ সম্পর্কে নয় ? না, আমি পেয়েছি, এটা হয়। শেষ সিরিজ + ডোটান খুব জঘন্য চালাক।
মাইকসার্ভ

1
আপনি সর্বদা সেরা প্রশ্নগুলি খুঁজে পান। অভিযুক্ত ডটান আমাকে কিছুক্ষণ ছুড়ে ফেলেছিল - সম্ভবত এখনও আছে, আমি এখনও এটি পরীক্ষা করে দেখিনি। ধন্যবাদ, ডন
মাইকেসার্ভ

2

এখানে আরও একটি sed:

sed  -e:n -e'/\n#.*\ndotan/!{$!{N;/^#/bn'      \
-eb  -e\} -e'/^#/s/\(\n\)\(dotan.*\)*/\1#\2/g' \
-et  -e\} -eP\;D <in >out

আপনি চান হিসাবে এটি করে। এটি কেবল একটি স্ট্যাকের উপর কাজ করে - যখন প্রয়োজন হয় তখন এটি তৈরি করা এবং মন্তব্য করা লাইনের উপস্থিতির মধ্যে যতক্ষণ প্রয়োজন ততক্ষণ পর্যন্ত এবং পুরানো বাফারটিকে নতুন মন্তব্য করা লাইনের পক্ষে আরও ইনপুটটিতে ডাম্প করার সময় এটি খুঁজে পাওয়া যায়। ছবি ...

এখানে চিত্র বর্ণনা লিখুন

দুঃখিত, আমি জানি না কেন আমি এটি করেছি। তবে মনে মনে এলো।

যাইহোক, sedসর্বশেষ মন্তব্য করা লাইনের মধ্যে যে কোনও সিরিজে বাফারগুলি ছড়িয়ে দেয়, শেষ মন্তব্যটির ঘটনাটি সঠিকভাবে ট্র্যাক করার জন্য তার বাফারটিতে আর কোনও একক বজায় রাখে না এবং যদি কোনও সময় এটি শেষ লাইনের মুখোমুখি হয় তবে এটি চেষ্টা করার চেষ্টা করবে চূড়ান্ত gলোবলাল এক্সিকিউশন স্টেটমেন্ট এবং শাখাটি tপুরো বাফারটি মুদ্রিত হতে পারে, অন্যথায় এটি Pযত তাড়াতাড়ি এটি হবে তার সমস্ত বাফার থেকে এটি প্রকাশ করে lines

আমার ধারণা, এই বিষয়টিই মনের মধ্যে একত্রিত হয়েছে ...

printf %s\\n   \#alice \#bob charlie dotan eric \
               \#alice \#bob charlie dotan eric \
               \#alice \#bob charlie dotan eric |
sed  -e:n -e'l;/\n#.*\ndotan/!{$!{N;/^#/bn'     \
-eb  -e\} -e'/^#/s/\(\n\)\(dotan.*\)*/\1#\2/g'  \
-et  -e\} -eP\;D

#alice
#alice\n#bob$
#alice\n#bob\ncharlie$
#alice\n#bob\ncharlie\ndotan$
#alice
#bob\ncharlie\ndotan$
#bob\ncharlie\ndotan\neric$
#bob\ncharlie\ndotan\neric\n#alice$
#bob\ncharlie\ndotan\neric\n#alice\n#bob$
#bob\ncharlie\ndotan\neric\n#alice\n#bob\ncharlie$
#bob\ncharlie\ndotan\neric\n#alice\n#bob\ncharlie\ndotan$
#bob
charlie\ndotan\neric\n#alice\n#bob\ncharlie\ndotan$
charlie
dotan\neric\n#alice\n#bob\ncharlie\ndotan$
dotan
eric\n#alice\n#bob\ncharlie\ndotan$
eric
#alice\n#bob\ncharlie\ndotan$
#alice
#bob\ncharlie\ndotan$
#bob\ncharlie\ndotan\neric$
#bob\ncharlie\ndotan\neric\n#alice$
#bob\ncharlie\ndotan\neric\n#alice\n#bob$
#bob\ncharlie\ndotan\neric\n#alice\n#bob\ncharlie$
#bob\ncharlie\ndotan\neric\n#alice\n#bob\ncharlie\ndotan$
#bob
charlie\ndotan\neric\n#alice\n#bob\ncharlie\ndotan$
charlie
dotan\neric\n#alice\n#bob\ncharlie\ndotan$
dotan
eric\n#alice\n#bob\ncharlie\ndotan$
eric
#alice\n#bob\ncharlie\ndotan$
#alice
#bob\ncharlie\ndotan$
#bob\ncharlie\ndotan\neric$
#bob
#charlie
#dotan
eric

এই কমান্ড এবং উপরের একটির মধ্যে একটি মাত্র পার্থক্য রয়েছে এবং তা হল lশীর্ষে ook কমান্ড। আমরা যখন কাজ করি তেমন প্যাটার্ন স্পেসে lনজর রাখি তখন আমরা sedপর্দার আড়ালে কী ঘটে যায় তার একটি আরও ভাল ধারণা পেতে পারি এবং এর প্রচেষ্টা কীভাবে পরিচালিত করা যায় সে সম্পর্কে আরও ভাল ধারণা পেতে পারি।

এই ক্ষেত্রে আমরা sedস্ট্যাক ইনপুটটি পর্যবেক্ষণ করতে পারি যতক্ষণ না ইনপুটটির দ্বিতীয় ঘটনা খুঁজে পাওয়া যায় \n#.*\ndotanএবং এটি যখন একবারে পূর্ববর্তী একটি লাইন মুদ্রণ শুরু করে। এটা দুর্দান্ত। আমি এই উপর কাজ অনেক শিখেছি।


খুব সুন্দর, ধন্যবাদ! ব্যাখ্যা সহ চূড়ান্ত অনুচ্ছেদটি ভয়ঙ্কর, আমি এই পোস্টটি থেকে শিখতে বেশ কিছুটা সময় ব্যয় করব। চমৎকার স্ট্যাক!
dotancohen

1
@ ডোটানকোহেন - এটি সত্যিই একটি ভাল প্রশ্ন ছিল। স্ট্যাকটি দেখতে সম্পাদনাটি দেখুন ।
মাইকসার্ভ

2
আমি সম্পাদনা ইতিহাসে প্রবেশের নোটিশ Handle many dotans। আমি নিশ্চিত যে এটি আমার স্ত্রীর সবচেয়ে খারাপ দুঃস্বপ্ন।
dotancohen

1
@ ডোটানকোহেন - হ্যাঁ, এটি একটি কঠিন বিষয় ছিল। স্টাফের মতো #\ndotan\ndotanজিনিসগুলি এই জিনিসগুলির পক্ষে শক্ত। আমি এটি বলতে চাই যখন আমি এটি একটি ভাল প্রশ্ন বলি। আমি মনে করি আমি এটা শুধু নিখুঁত সম্পর্কে পেয়েছিলাম, কিন্তু এক সমস্যা পারে আপনার মন্তব্যকে ব্লক একটি 1000 লাইন দিয়ে আলাদা করা হয়, তাহলে মধ্যে চালানো হয় - যে হবে এটা মন্দীভূত। উদাহরণস্বরূপ, এটি বাফারটি ছড়িয়ে s/\n/&/150;tদেওয়ার জন্য প্রথম /\n#জিনিসটির মতো কিছু সংযুক্ত করতে পারে উদাহরণস্বরূপ। আর যাই হোক, হয়তো এটা শুধু কি সে জন্য অপেক্ষা করা হয়েছে এর সব বরাবর !
মাইকসার্ভ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.