রেডেক্স ক্যাপচার গ্রুপ সামগ্রীকে সেড ব্যবহার করে প্রতিস্থাপন করুন


16

আমি প্রোগ্রাম হিসাবে আমার nginx.conf ফাইলটি সম্পাদনা করার চেষ্টা করছি, যার মধ্যে একটি লাইন রয়েছে:

        access_log /var/log/nginx/access.log;

যা আমি এর মতো দেখতে চাই:

        access_log /dev/stdout;

আমি বিশ্বাস করি যে রেজেক্স একটি ক্যাপচার গ্রুপে অংশটি ^\s*access_log([^;]*);ক্যাপচার করবে /var/log/nginx/access.log, তবে আমি নিশ্চিত না যে কীভাবে ক্যাপচার গ্রুপটিকে সেডের সাথে সঠিকভাবে প্রতিস্থাপন করা যায়?

আমি চেষ্টা করেছিলাম

echo "        access_log /var/log/nginx/access.log;" | sed 's/^\s*access_log([^;]*);/\1\\\/dev\\\/stdout/'

তবে আমি ত্রুটিটি পাচ্ছি:

sed: -e expression #1, char 45: invalid reference \1 on `s' command's RHS

যদি আমি চেষ্টা করি sed -rতবে কোনও ত্রুটি নেই, তবে আউটপুটটি আমার প্রত্যাশা নয়:

 /var/log/nginx/access.log\/dev\/stdout

আমি ক্যাপচার গ্রুপের সাথে স্মার্ট হওয়ার চেষ্টা করছি এবং "অ্যাক্সেস_লগ /var/log/nginx/access.log" জন্য সরাসরি কী খুঁজে পাচ্ছি না; ক্ষেত্রে যদি বিতরণ ডিফল্ট লগ ফাইলের অবস্থান পরিবর্তন করে।


1
sed '/access_log/s|/[^;]\+|/dev/stdout|'
— কোস্টাস

@ কাস্টাস আপনি যদি এই উত্তরটি দিয়ে থাকেন তবে আমি আপনাকেও উজ্জীবিত করব যেটি কাজ করে!
— অ্যাবে ভোলেকার

উত্তর:


16

সেখানে বেশ কয়েকটি ভুল হয়েছে।

প্রথমত, যেহেতু sedপ্রাথমিক নিয়মিত অভিব্যক্তিগুলি ব্যবহার করা হয়, আপনার প্রয়োজন \(এবং \)একটি ক্যাপচার গ্রুপ তৈরি করুন। -rসুইচ রেগুলার এক্সপ্রেশনের বাড়ানো সক্ষম যার কারণে আপনি ত্রুটি পাবেন না। দেখুন কেন আমাকে রেডেক্স অক্ষর হিসাবে ব্যাখ্যা করার জন্য সেডে রেজেক্স অক্ষরগুলি পালাতে হবে? ।

দ্বিতীয়ত, আপনি ক্যাপচার গ্রুপটিকে ভুল জায়গায় রেখে দিচ্ছেন। যদি আমি আপনাকে সঠিকভাবে বুঝতে পারি তবে আপনি এটি করতে পারেন:

sed -e 's!^\(\s*access_log\)[^;]*;!\1 /dev/stdout;!' your_file

!ফরোয়ার্ড স্ল্যাশগুলি এড়িয়ে যেতে এড়াতে রেজেক্স ডিলিমিটার হিসাবে ব্যবহারটি লক্ষ্য করুন /dev/stdout।


ধন্যবাদ, আশ্চর্যজনকভাবে কাজ করে! আমি এটি এখনও স্বীকৃত হিসাবে চিহ্নিত করতে পারছি না, তবে এটি করতে 9 মিনিটের মধ্যে ফিরে আসব।
— অ্যাবে ভোলেকার

1
@ অ্যাবেভোলেকার আমি আনন্দিত আমি সাহায্য করতে পারে।
— জোসেফ আর।

5

আপনার রিজেপ্সে আপনার জানা উচিত যে \No.এটি বন্ধনীগুলির মধ্যে প্যাটার্নের পিছনে উল্লেখ() । সুতরাং regexp হওয়া উচিত's@^(\s*access_log ).*$@\1/dev/stdout/;@'

আমি একটা অফার করতে পারি

sed '/access_log/s|/[^;]\+|/dev/stdout|'

ইঙ্গিত: আপনি /যে প্যাটার্নটির অভ্যন্তরে ব্যবহার করতে চান তা উদাহরণস্বরূপ s///আপনি যে প্রতিটি প্রতীকের জন্য পরিবর্তন করতে চান তা নির্দ্বিধায়s###


ধন্যবাদ, আমি আশা করি আমি দুটি উত্তর গ্রহণ করতে পারে! সমাধানগুলি দেখার পরে সাহায্যের জন্য জিজ্ঞাসা করার আগে ম্যান পৃষ্ঠাগুলি পুরোপুরি না পড়ার জন্য আমি আর আফসোস করি না।
— আবে ভোলেকার

3

এটি ক্যাপচার করার পরিবর্তে, কেন কেবল এটি সন্ধান করে একটি বিকল্প প্রতিস্থাপন করবেন না? অর্থাৎ,

sed "/access_log/ s| /.*;| /dev/stdout;|"

এটি " access_log" মেলে এমন লাইনের জন্য অনুসন্ধান করে যে কোনও লাইনে এটি " /whatever/path/is/there;" এর সাথে " /dev/stdout;" প্রতিস্থাপন করবে

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