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


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.