সেড ত্রুটি: "কমান্ডের আরএইচএসে" অবৈধ রেফারেন্স \ 1 "


106

আমি মাভেনের জন্য রঙিন স্ক্রিপ্টের মূল হিসাবে বেশ কয়েকটি প্রতিস্থাপন কমান্ড পরিচালনা করি । এক sedকমান্ড একটি রেগুলার এক্সপ্রেশন যা শেল খোজা কাজ করে যেমন ব্যবহার এখানে আলোচনা । বর্তমান (কাজ করছে না) বাস্তবায়ন এখানে পাওয়া যাবে

আমি যখন স্ক্রিপ্টে কমান্ডের একটি রূপকে অন্তর্ভুক্ত করি তখন বিভিন্ন আচরণ ঘটে:

বৈকল্পিক 1:

$ sed -re "s/([a-zA-Z0-9./\\ :-]+)/\1/g"

স্ক্রিপ্ট অনুসারে:

-re "s/WARNING: ([a-zA-Z0-9./\\ :-]+)/${warn}WARNING: \1${c_end}/g" \

ত্রুটি: শেলটি একই তথ্য আউটপুট করে যেমন আমি টাইপ করি $ sed। আজব !?


বৈকল্পিক 2:

$ sed -e "s/\([a-zA-Z0-9./\\ :-]\+\)/\1/g"

স্ক্রিপ্ট অনুসারে:

-e "s/WARNING: \([a-zA-Z0-9./\\ :-]\+\)/${warn}WARNING: \1${c_end}/g" \

ত্রুটি:

sed: -e অভিব্যক্তি # 7, চর 59: অবৈধ রেফারেন্স \ 1 এর `s 'কমান্ডের আরএইচএসে


10
আমার ক্ষেত্রে আমি একটি -i(স্থান বিকল্পে সম্পাদনা) এর সাথে একত্রিত করেছি -re, যার ফলস্বরূপ -ire(যাতে এটি খণ্ডটিকে তার আর্গুমেন্ট হিসাবে -iগ্রাস করছিল এবং তাই বর্ধিত রেজেক্স মোড সক্ষম করা হয়নি); সমস্যাটি স্থির করে এটিকে পরিবর্তন করা । reSUFFIX-i -re
জনক বান্দারা

এটি আরও লক্ষণীয় যে একক উদ্ধৃতি 'এবং ডাবল উদ্ধৃতিগুলি "কিছুটা আলাদা বিবেচিত হয়, বিশেষত ব্যাখ্যার সময় $vars। উদাহরণস্বরূপ: sudo sh -c "sed -r -i 's/(^.+_supplicant.conf)/\1${MTXT}/' /etc/network/interfaces"কাজ করে, কিন্তু: sudo sh -c 'sed -r -i "s/(^.+_supplicant.conf)/\1${MTXT}/" /etc/network/interfaces'না।
not2qubit

উত্তর:


59

কাজ করার জন্য আপনার আসলে ক্যাপচার করার দরকার নেই? যেমন # 2 রূপের জন্য:

-r -e "s/WARNING: (\([a-zA-Z0-9./\\ :-]\+\))/${warn}WARNING: \1${c_end}/g" \

(দ্রষ্টব্য: অপরিশোধিত)

-rযুক্তি ব্যতীত ব্যাক-রেফারেন্সগুলি (যেমন \1) কাজ করবে না।


43
-rSed প্রদর্শিত হয় করার অপশন কাজ ব্যাক রেফারেন্সের জন্য প্রয়োজনীয় যাবে। যেমন sed -e 's/([[:digit:]])/is a digit/'কাজ করে তবে sed -e 's/([[:digit:]])/\1 is a digit/সেড না করে মূল ত্রুটি তৈরি করে -rদ্রষ্টব্য: শেডের প্রথম অনুরোধ একটি আক্ষরিক জন্য অনুসন্ধান (<digit>)এবং এটি কোনও ক্যাপচার গ্রুপ নয়।
অ্যান্ড্রু ফালঙ্গা

উত্তরের নীচের মন্তব্যটি আসলে একটি উত্তর। আপনার উত্তরটি প্রতিফলিত করতে আপনি এটি সম্পাদনা করতে পারেন।
মিরোক্লাভ

@ অ্যান্ড্রুফালঙ্গা আপনার উত্তর হিসাবে আপনার মন্তব্য পোস্ট করা উচিত ছিল
সানমাই

4
আমার ভুলটি ছিল ব্যবহারের -ireপরিবর্তে ব্যবহার করা -ri। অর্ডার বিষয়গুলি :-)
এম

57

এই ত্রুটিটি বন্ধ হয়ে যাওয়া বন্ধনীগুলির পক্ষে সাধারণ। এগুলি থেকে পালাতে এবং আবার চেষ্টা করুন।


উদাহরণ স্বরূপ:

/^$/b
:loop
$!{
N
/\n$/!b loop
}
s/\n(.)/\1/g

প্রতিটি প্রথম বন্ধনের আগে ব্যাকস্ল্যাশ সহ পালাতে হবে:

/^$/b
:loop
$!{
N
/\n$/!b loop
}
s/\n\(.\)/\1/g

7
মনোযোগ দিন, আপনি যদি ব্যবহার করেন তবে আপনাকে -rপ্রথম বন্ধনী থেকে বাঁচতে হবে না।
qräbnö

15

যদি -r/ --regexp-extendedঅপশনটি সরবরাহ না করা হয় তবে ক্যাপচারিং প্রথম বন্ধনীগুলি অবশ্যই পালাতে হবে।


6

আপনার /পরে পালাতে হবে.

sed -e "s/\([a-zA-Z0-9.\/\\ :-]\+\)/\1/g"

অথবা আপনি যদি পালানোর বিষয়ে চিন্তা করতে না চান তবে ব্যবহার করুন |

sed -e "s|\([a-zA-Z0-9./\\ :-]\+\)|\1|g"

সম্পাদনা:

sed -e "s|WARNING: \([a-zA-Z0-9.-/\\ :]+\)|${warn}WARNING: \1${c_end}|g"

যুক্তিসঙ্গত। তবে এটি স্ক্রিপ্টের প্রসঙ্গে কাজ করে না।
জেজেডি

দুঃখিত সম্পাদন করা ত্রুটি উত্থাপন: sed: -e expression #7, char 58: Invalid range end। @ ডেনিসের উত্তর কাজ করে।
জেজেডি

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