এসইডি একাধিক লাইন জুড়ে প্রতিস্থাপন


11

আমি এই তিনটি লাইন সন্ধান করার চেষ্টা করছি:

<!--
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
-->

এবং এগুলি প্রতিস্থাপন করুন:

<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />

আমি যখন চেষ্টা করি

sudo sed -i 's:<!-- <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" /> -->:<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />:' /myfile.xml

এটি এটি খুঁজে পায় না, আমি এটিতে \ n দেওয়ার চেষ্টাও করেছি, তবে এটি এখনও কার্যকর হয়নি:

sudo sed -i 's:<!--\n <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />\n -->:<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />:' /myfile.xml

এগুলি কোনও ত্রুটি ছুঁড়ে না দেয় এটি কেবল লাইনটিকে অসুবিধে করে না। কোন পরামর্শ ধন্যবাদ সাহায্য করবে!

উত্তর:


6

সেড প্রতিটি লাইন ঘুরে পড়েন, সুতরাং যদি আপনি এটি কোনও দিকে সঠিকভাবে চাপ না দেন তবে কোনও মাল্টলাইন প্যাটার্নের সাথে এটি কখনও মিলবে না। Nকমান্ড ইনপুট থেকে এক লাইন পড়ে এবং প্যাটার্ন স্থান থেকে এটি appends।

sed -i -e '/^<!--$/ {
    N; /\n<Connector port="8009" protocol="AJP\/1\.3" redirectPort="8443" \/>$/ {
        N; /\n-->$/ {
            s/^<!--\n//; s/\n-->$//
        }
    }
}' /myfile.xml

তর্কসাপেক্ষভাবে, আপনার যদি অন্য কোনও কমান্ডের প্রয়োজন হয় sতবে আপনাকে সেড থেকে সরে যেতে হবে এবং খালি বা পার্ল করা উচিত। এখানে কিছুটা আরও নমনীয় পার্ল স্নিপেট যা আরও সাধারণ উপায়ে মাল্টলাইন মন্তব্যগুলির সাথে অনুলিপি করে।

perl -i -pe '
    if (/<!--/) { $_ .= <> while !/-->/;
        s[<!--\n(<Connector port="8009" protocol="AJP/1\.3" redirectPort="8443" />)\n-->][$1];
    }' /myfile.xml

6

শেড একটি লাইন বাই লাইন ভিত্তিতে কাজ করে। এটি একাধিক লাইনে কাজ করার জন্য তৈরি করা যেতে পারে, তবে এটি সেভাবে ডিজাইন করা হয়নি - এবং আমার মতে আপনি অবশ্যই এটির ব্যবহারের চেষ্টা করার সময় তা অবশ্যই দেখাবে। তবে আপনি যদি সেই পথে যাওয়ার সিদ্ধান্ত নেন তবে আপনাকে সম্ভবত রেজিস্টারগুলি ব্যবহার করতে হবে। কীভাবে এটি করা যায় তা দেখতে /programming/1251999/sed-how-can-i-replace-a-newline-n এর কয়েকটি সমাধান দেখুন।

আমি এই ধরণের টাস্ক (মাল্টি-লাইন-ওরিয়েন্টেড, মানে) এর জন্য সেডের পরিবর্তে পার্ল ব্যবহার করতে পছন্দ করি। অনুসন্ধান এবং প্রতিস্থাপনের আগে আপনাকে যে বয়লারপ্লেটটি যুক্ত করতে হবে ( BEGIN...) স্পষ্ট তা নয়, তবে রেজেক্সটি আমার কাছে আরও পরিষ্কার দেখাচ্ছে:

perl -i.bak -pe 'BEGIN{undef $/;} s/<!--string-->/string/smg' file.xml

বা, সংক্ষিপ্ত বিবরণ সংক্ষিপ্তকরণ এবং আপনাকে সেখানে একটি রেজেেক্স ব্যবহারের অনুমতি দেওয়ার জন্য গ্রুপিং ব্যবহার করে:

perl -i.bak -pe 'BEGIN{undef $/;} s/<!--(string_or_regex)-->/\1/smg' file.xml

মন্তব্য মার্কার এবং কোডটি নিরক্ষিত হওয়ার মধ্যে নিউলাইনগুলি সহ এবং এর বাইরে উভয় ক্ষেত্রেই এটি কাজ করা উচিত।

থেকে অভিযোজিত:

/programming/1030787/multiline-search-replace-with-perl


আপনার সহায়তার জন্য আপনাকে ধন্যবাদ, দেখে মনে হচ্ছে এটি একটি ব্যথার মতো, আমি সিদ্ধান্ত নিয়েছি যে একটি কাজ করা উচিত
ডগ মলিনাক্স

3

এখানে এসইডিতে মাল্টলাইন কমান্ডগুলির একটি বর্ণনা রয়েছে: http://docstore.mik.ua/orelly/unix/sedawk/ch06_01.htm

এটা বাট একটি ব্যথা। আপনি এদুয়ার্দোর পরামর্শ অনুসরণ করতে এবং perl -i -p -eপরিবর্তে ব্যবহার করতে চাইতে পারেন ।


আমি কপিরাইটযুক্ত উপাদানের অননুমোদিত অনুলিপিগুলিতে লিঙ্ক করব না।
মার্ক ওয়াগনার

1
  • /<\!--/ : ম্যাচিং স্ট্রিং
  • :X : এটি শাখা কমান্ড "বি" এর জন্য একটি লেবেল
  • /-->/ : ম্যাচিং স্ট্রিং
  • s@...@...@p : স্ট্রিপ "<! -", "->" এবং মুদ্রণ ফলাফল
  • d : প্যাটার্ন স্পেস মুছুন এবং নতুন চক্র শুরু করুন
  • N : / /> / এর সাথে মেলে না হলে একটি লাইন যুক্ত করুন
  • bX : শাখা থেকে: এক্স লেবেল
  • p : কেবল একটি স্ট্রিং মুদ্রণ করুন যা / <! - / এর সাথে মেলে না

sed -rn '
/<!--/ {
    :X
    /-->/ {
        s@<!--\s*(<.+/>)\s*-->@\1@p
        d
    }
    N
    bX
};p'

এবং এই দ্বিতীয় পদ্ধতিটি হ'ল সাধারণ আকারের পাঠ্য ফাইলগুলির (শেল স্ক্রিপ্ট ফাইলের প্রয়োজন হয়) একটি সাধারণ অনুলিপি এবং ভারব্যাটিম প্রতিস্থাপনের পেস্ট করুন

#!/bin/bash

# copy & paste content that you want to substitute

AA=$( cat <<\EOF | sed -z -e 's#\([][^$*\.#]\)#\\\1#g' -e 's#\n#\\n#g'
<!--
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
-->
EOF
)

BB=$( cat <<\EOF | sed -z -e 's#\([&\#]\)#\\\1#g' -e 's#\n#\\n#g'
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
EOF
)

sed -z -i 's#'"${AA}"'#'"${BB}"'#g' *.xml   # apply to all *.xml files

1) আপনার উত্তরের জন্য আপনাকে ধন্যবাদ। 2) কেবল কোড স্নিপেটগুলি সন্নিবেশ করা সত্যিই ঠিক নয়, আপনি যদি ব্যাখ্যা করেন, এটি কী করে এবং কীভাবে হয় তবে এটি আরও ভাল।
পিটারহ - মনিকা পুনরায় ইনস্টল করুন 15'17
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.