#begin command block
#append all lines between two addresses to hold space
sed -n -f - <<\SCRIPT file.xml
\|<tag1>|,\|</tag1>|{ H
#at last line of search block exchange hold and pattern space
\|</tag1>|{ x
#if not conditional ; clear buffer ; branch to script end
\|<tag2>[^<]*foo[^\n]*</tag2>|!{s/.*//;h;b}
#do work ; print result; clear buffer ; close blocks
s?*?*?;p;s/.*//;h;b}}
SCRIPT
যদি আপনি উপরের কাজটি করে থাকেন, সেখানে প্রদর্শিত শেষ পরিচ্ছন্নতার লাইনের আগে আপনি যে ডেটা দেখিয়েছেন সেগুলি দেওয়াতে, আপনার sed
দেখায় এমন একটি প্যাটার্ন স্পেস দিয়ে কাজ করা উচিত :
^\n<tag1>\n<tag2>foo</tag2>\n</tag1>$
যখনই আপনি l
uk দিয়ে পছন্দ করেন আপনি আপনার প্যাটার্নের স্থানটি মুদ্রণ করতে পারেন । তারপরে আপনি \n
অক্ষরগুলিতে সম্বোধন করতে পারেন ।
sed l <file
আপনাকে প্রতিটি লাইনটি sed
যে পর্যায়ে l
ডাকা হয় তার প্রক্রিয়ায় দেখায় ।
সুতরাং আমি এটি পরীক্ষা করেছি এবং প্রথম লাইনে এটির \backslash
পরে আরও একটি প্রয়োজন ,comma
ছিল, তবে অন্যথায় যেমন হয় তেমন কাজ করে। এখানে আমি এটিকে যুক্ত করেছি _sed_function
যাতে আমি পুরো উত্তর জুড়ে সহজেই এটি প্রদর্শনের উদ্দেশ্যে কল করতে পারি: (মন্তব্যগুলির সাথে অন্তর্ভুক্ত রয়েছে তবে ব্রেভিটির জন্য এখানে সরানো হয়েছে)
_sed_function() { sed -n -f /dev/fd/3
} 3<<\SCRIPT <<\FILE
\|<tag1>|,\|</tag1>|{ H
\|</tag1>|{ x
\|<tag2>[^<]*foo[^\n]*</tag2>|!{s/.*//;h;b}
s?*?*?;p;s/.*//;h;b}}
#END
SCRIPT
<tag1>
<tag2>bar</tag2>
</tag1>
<tag1>
<tag2>foo</tag2>
</tag1>
FILE
_sed_function
#OUTPUT#
<tag1>
<tag2>foo</tag2>
</tag1>
এখন আমরা সুইচ করব p
একটি জন্য l
তাই আমরা তা দেখতে পারেন আমরা যেমন আমরা আমাদের স্ক্রিপ্ট বিকাশ এবং অ অপ ডেমো অপসারণ কাজ করছি s?
আমাদের শেষ লাইন, যাতে sed 3<<\SCRIPT
মত শুধু দেখায়:
l;s/.*//;h;b}}
তারপরে আমি এটিকে আবার চালাব:
_sed_function
#OUTPUT#
\n<tag1>\n <tag2>foo</tag2>\n</tag1>$
ঠিক আছে! সুতরাং আমি ঠিক ছিলাম - এটি একটি ভাল অনুভূতি। এখন, আসুন আমরা আমাদের l
লাইনটি ঘুরে দেখি যে এটিগুলি যে রেখাগুলি টানছে তবে মুছে ফেলা হয়েছে তা দেখতে। আমরা আমাদের বর্তমানটি সরিয়ে দেব l
এবং !{block}
এটিতে এটির মতো যুক্ত করব:
!{l;s/.*//;h;b}
_sed_function
#OUTPUT#
\n<tag1>\n <tag2>bar</tag2>\n</tag1>$
আমরা এটি মুছার ঠিক আগে এটি দেখতে দেখতে এটির মতোই।
একটি শেষ জিনিস যা আমি আপনাকে দেখাতে চাই তা হ'ল H
পুরানো স্থানটি এটি তৈরি করার সাথে সাথে। কয়েকটি মূল ধারণা রয়েছে যা আমি আশাবাদী আমি প্রদর্শন করতে পারি। সুতরাং আমি l
আবার শেষ ook অপসারণ এবং শেষে H
পুরানো স্থান মধ্যে একটি উঁকি যোগ করার জন্য প্রথম লাইন পরিবর্তন :
{ H ; x ; l ; x
_sed_function
#OUTPUT#
\n<tag1>$
\n<tag1>\n <tag2>bar</tag2>$
\n<tag1>\n <tag2>bar</tag2>\n</tag1>$
\n<tag1>$
\n<tag1>\n <tag2>foo</tag2>$
\n<tag1>\n <tag2>foo</tag2>\n</tag1>$
H
পুরানো স্থান লাইনের চক্র থেকে বেঁচে থাকে - তাই নাম। সুতরাং লোকেরা প্রায়শই কী ট্রিপ করে নেয় - ঠিক আছে, আমি প্রায়শই কী ট্রিপ করি - তা হ'ল এটি ব্যবহার করার পরে এটি মুছতে হবে। x
এক্ষেত্রে আমি কেবল একবার ই পরিবর্তন করি , সুতরাং হোল্ড স্পেসটি প্যাটার্ন স্পেস এবং বিপরীত হয়ে যায় এবং এই পরিবর্তনটি লাইনের চক্রগুলিতেও বেঁচে থাকে।
প্রভাবটি হ'ল আমার হোল্ড স্পেসটি মুছতে হবে যা আমার প্যাটার্ন স্পেস হিসাবে ব্যবহৃত হত। আমি প্রথমে বর্তমান প্যাটার্নের স্পেসটি সাফ করে এটি করি:
s/.*//
যা কেবল প্রতিটি চরিত্রকে নির্বাচন করে এবং এটিকে সরিয়ে দেয়। আমি ব্যবহার করতে পারি না d
কারণ এটি আমার বর্তমান লাইন চক্রটি শেষ করবে এবং পরবর্তী কমান্ডটি সম্পূর্ণ হবে না, যা আমার স্ক্রিপ্টটিকে প্রায় ট্র্যাশ করবে।
h
এটি এর অনুরূপভাবে কাজ করে H
তবে এটি স্থান ধরে রাখার জায়গাটিকে ওভাররাইট করে, সুতরাং আমি কার্যকরভাবে এটি মুছে ফেলতে আমার ফাঁকা প্যাটার্নের স্থানটি আমার হোল্ড স্পেসের উপরের অংশে অনুলিপি করেছি। এখন আমি ঠিক করতে পারি:
b
বাইরে।
এবং এইভাবেই আমি sed
স্ক্রিপ্ট লিখি ।