একাধিক ফাইলে পাঠ্যের একটি লাইন যুক্ত করা হচ্ছে


10

সুতরাং, আমার কাছে একটি ডিরেক্টরিতে গুচ্ছ ফাইল রয়েছে এবং সেগুলির প্রত্যেকটিতে আমার একটি পাঠ্য লাইন toোকানো দরকার। তাদের মূলত নিম্নলিখিত ফর্ম্যাটটি রয়েছে:


<VirtualHost *:80>
        ServerAdmin gabe@localhost
        DocumentRoot /var/www/test1
        ServerName test1.local
        ServerAlias test1
        <Directory "/var/www/test1">
                Options All
                AllowOverride All
        </Directory>
</VirtualHost>

এবং আমি বন্ধ হওয়ার আগে একটি লাইন inোকাতে চাই

</ VirtualHost>
ট্যাগ। আমার প্রথম অনুমানটি হ'ল আমার সম্ভবত এটি ট্যাগের সাথে মেলানো এবং প্রতিস্থাপনের মাধ্যমে সেডের সাথে এটি করতে সক্ষম হওয়া উচিত। আমি এখনই এই চেষ্টাটি শুরু করতে যাচ্ছি, তবে কারও কাছে এটি করার কোনও বিদ্যমান উপায় থাকলে আমি এটি শুনতে পছন্দ করব।


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

2
ধন্যবাদ, তবে এটি এমন একটি কাজ যা সাধারণ ইউনিক্স সরঞ্জামগুলির সাথে সম্পাদন করা সহজ হওয়া উচিত, তাই এখানে জিজ্ঞাসা করা হয়েছিল। যদিও আপনার মন্তব্যের জন্য ধন্যবাদ।
গ্যাবে

উত্তর:


10

এটার মতো কিছু:

sed 's/<\/VirtualHost>/yourlinehere\n<\/VirtualHost>/'

কাজ করে। আপনি যদি প্রচুর ফাইলে এই আদেশটি পুনরাবৃত্তি করতে চান তবে আপনি কিছু করতে পারেন:

for i in *; do sed -i 's/<\/VirtualHost>/yourlinehere\n<\/VirtualHost>/' "$i"; done

সম্ভবতঃ ক্রিসডাউনকে আরও ভাল (তবে অরক্ষিত) ধন্যবাদ:

find . -type f -print0 | while IFS= read -r -d '' filename;\
do sed -i 's/<\/VirtualHost>/yourlinehere\n<\/VirtualHost>/' $filename;\ 
done

দুর্দান্ত ... আমি যা খুঁজছিলাম ঠিক এটিই is
গ্যাবে

1
এলএস পার্স করবেন না । পরিবর্তে একটি গ্লোব ব্যবহার করুন। mywiki.wooledge.org/ParsingLs
ক্রিস ডাউন

আপনি অনিশ্চিত @ ক্রিসডাউন দয়া করে আমার উত্তরটি উন্নত করুন।
lcipriani

/সেড এক্সপ্রেশনের চেয়ে আলাদা চরিত্র নির্বাচন করা পরিষ্কার, কারণ আপনার স্ল্যাশ থেকে বাঁচতে হবে না:'s:</VirtualHost>:yourlinehere\n</VirtualHost>:'
আলেকজান্ডার

2

আপনি যদি পার্ল চেষ্টা করতে আপত্তি না করেন:

perl -pi'*.old' -e 's(</VirtualHost>(Your stuff here\n</VirtualHost>)' myfile

-iসুইচ একটি সঙ্গে আপনার পুরনো ফাইল সংরক্ষণ করতে হবে .oldএক্সটেনশান এবং বর্তমান এক মুদ্রণ করুন।


2

আপনি করতে চাইছেন সম্পাদনাটি কিছুটা জটিল হলেও আপনি "প্রাক্তন" (কমান্ড-লাইন vi) ব্যবহার করতে পারেন। উদাহরণস্বরূপ, আপনি কেবল "" উদাহরণের একটি ক্ষেত্রে সন্নিবেশটি করতে চান।

এটির মতো একটি শেল স্ক্রিপ্ট কাজ করতে পারে:

for FILENAME in *.whatever  # Need a criteria to glob, or a list of names
do
    ex -s $FILENAME << END_EDITS
/^<\/VirtualHost>/
O " capital-o, not zero
text to insert goes here
.
w!
q
END_EDITS
done

এই পদ্ধতির সাহায্যে আপনাকে "প্রাক্তন" এর সুবিধা দেওয়া হবে: ইলবোবার্ট নিদর্শনগুলির সাথে একটি অবস্থান এবং 'কার্সার মুভমেন্ট'। আপনি কোনও প্যাটার্ন সন্ধান করার মতো জিনিসগুলি করতে পারেন, তারপরে পরবর্তী উদাহরণটি সন্ধান করুন, তারপরে সন্নিবেশ করুন। অথবা আপনি কেবল সন্নিবেশগুলি না করে পাঠ্য পরিবর্তন করতে পারেন। অথবা আপনি ব্যাপ্তির মধ্যে পরিবর্তন করতে পারেন। ভুলে যাবেন না যে "প্রাক্তন" আপনাকে "ব্যবহার করতে দেয়"। বর্তমান লাইন হিসাবে, সুতরাং, / ^ সাম্প্রতিক / এস / ব্লাহ / ফু / কাজ করবে।


0

'ভার্চুয়ালহস্ট' এর আগে আপনার ক্ষেত্রে ক্ষেত্রে কোনও ফাইলের একটি নির্দিষ্ট লাইন বা একাধিক লাইন সন্নিবেশ করানোর জন্য আপনি নিম্নলিখিত একক লাইন কোডটি ব্যবহার করতে পারেন। কোডটি মূলত ফাইলের নাম অনুসন্ধান করে (এটি *। * হতে পারে, আপনি যদি সমস্ত ফাইলে পাঠ্য সন্নিবেশ করতে চান) প্রদত্ত ডিরেক্টরি এবং এর উপ ডিরেক্টরিগুলির মধ্যে। পাওয়া ফাইলগুলির মধ্যে এটি 'ভার্চুয়ালহোস্ট' প্যাটার্নটির সন্ধান করে। এটি প্যাটার্নটি সন্ধান করার পরে এটি এটিকে ফার্স্টলাইন \ nsecondline \ notherlines \ n \ ভার্চুয়ালহোস্ট দিয়ে প্রতিস্থাপন করে। নোট করুন যে 'ভার্চুয়ালহস্ট' প্রতিস্থাপনের জন্য পাঠ্যের অংশ, অন্যথায় আমরা এটি হারাব।

find directory/ -name filename -print | xargs sed -i 's|VirtualHost|firstline\nsecondline\notherlines\nVirtualHost|g'
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.