সেড কমান্ড ব্যবহার করার সময় আমি কীভাবে প্রস্থান স্থিতি পেতে পারি?


11

grepকমান্ড একটি প্রস্থান অবস্থা দেয়:

$echo "foo.bar" | grep -o foo
foo
$echo $?
0
$echo "foo.bar" | grep -o pop
$echo $?
1  

তবে আমার ব্যবহার করা দরকার sedএবং আমি বুঝতে পারি যে এর কোনও প্রস্থান স্থিতি নেই:

$echo "foo.bar" | sed 's/bar.*$//'
foo.
$echo $?
0
$echo "foo.bar" | sed 's/pop.*$//'
foo.bar
$echo $?
0  

আমি জানি যে -qবিকল্পটি নিয়ে আমার চারপাশে খেলা উচিত , তবে আমি সফল হইনি।


7
নোট করুন যে sedখুব অবশ্যই একটি প্রস্থান স্থিতি আছে, এটি আপনার এখানে যা প্রয়োজন তা ঠিক তা করে না। যদি sedকমান্ড ব্যর্থ হয়, উদাহরণস্বরূপ, আপনি যদি এটি কোনও ফাইলে চালানোর চেষ্টা করেন তবে আপনার কাছে লেখার অ্যাক্সেস নেই বা নেই sedযা একটি নেই, একটি নন -0 প্রস্থান স্থিতি দিয়ে প্রস্থান করবেন। প্রস্থান স্থিতি ঠিক এটি নির্দেশ করে sedযা আপনি এটি করতে বলেছিলেন তা করতে সক্ষম এবং echo "foo.bar" | sed 's/pop.*$//'সঠিকভাবে কার্যকর হয়েছিল uted এটি দিয়ে সমস্ত লাইন মুছে ফেলা হয়েছে pop। এই জাতীয় লাইন ছিল অপ্রাসঙ্গিক, কমান্ড এখনও কাজ করে।
টেরডন

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

উত্তর:


13

আপনি প্রস্থান স্থিতি এন দিয়ে প্রস্থান করতে q এন ব্যবহার করতে পারেন - তবে এটি কার্যকর করার জন্য আপনাকে কিছু শাখা এবং প্রবাহ নিয়ন্ত্রণ ব্যবহার করতে হবে :

t
শর্তসাপেক্ষে শাখা (এটি: একটি লেবেলে ঝাঁপুন) কেবলমাত্র যদি s/// শেষ ইনপুট লাইনটি পড়ার পরে বা অন্য শর্তসাপেক্ষ শাখা নেওয়া হওয়ার পরে কোনও আদেশ সফল হয়।

N এর জন্য একটি মান নির্বাচন করা সবচেয়ে ভাল যা স্ট্যান্ডার্ড প্রস্থান স্থিতির মানগুলির মধ্যে আলাদা distin

শূন্যের একটি প্রস্থান স্থিতি সাফল্যের ইঙ্গিত দেয় এবং একটি ননজারো মান ব্যর্থতা নির্দেশ করে। GNU 'সেড' নিম্নলিখিত প্রস্থান স্থিতির ত্রুটির মানগুলি প্রদান করে:

0
 Successful completion.

1
 Invalid command, invalid syntax, invalid regular expression or a
 GNU 'sed' extension command used with '--posix'.

2
 One or more of the input file specified on the command line could
 not be opened (e.g.  if a file is not found, or read permission is
 denied).  Processing continued with other files.

4
 An I/O error, or a serious processing error during runtime, GNU
 'sed' aborted immediately.

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

$ echo "foo.bar" | sed 's/bar.*$//; t; q42' ; echo $? 
foo.
0

যেহেতু

$ echo "foo.bar" | sed 's/baz.*$//; t; q42' ; echo $? 
foo.bar
42

আপনাকে ডিফল্ট প্যাটার্ন স্থান মুদ্রণ বর্জন করতে চান তাহলে, তারপর প্রতিস্থাপন qদ্বারা Q(নোট যে Qএকটি গনুহ এক্সটেনশান)।


1

সেডের সাথে কীভাবে রেজেক্স অনুসন্ধান করা যায় এবং মিলগুলি হাইলাইট করতে হয় , বা কোনও মিল না পাওয়া গেলে প্রস্থান কোড (5) ফেরত কীভাবে পাবেন তা এখানে :

এটি ইনপুট.টেক্সট:

hello there
my dear old friend
a lot of things
we'll pass along the end

সমস্ত + হাইলাইট ম্যাচ + রিটার্ন প্রস্থান কোড মুদ্রণের জন্য এখানে আমার ফাংশনটি রয়েছে:

highlight()
{
  pattern=$1
  shift
  sed '/'"${pattern}"'/,${s//\x1b[32m&\x1b[0m/g;b};$q5' "$@"
}

$ হাইলাইট "লো \ | শেষ" ইনপুট। টেক্সট || প্রতিধ্বনি- "" \ n * কোনও মিল খুঁজে পাওয়া যায় নি *

হেইল লো সেখানে
আমার প্রিয় পুরানো শুক্র শেষ জিনিস
একটি lo t শেষ
আমরা একটি lo ng শেষ পাস করব

যখন কোনও মিল নেই, এটি প্রস্থান কোড (5) এ ফিরে আসবে। আপনি এটি বিড়াল এবং পাইপ দিয়ে ব্যবহার করতে পারেন | যেমন:

$ বিড়াল ইনপুট.টেক্সট | "হট \ | এবং" || হাইলাইট করুন প্রতিধ্বনি- "" \ n * কোনও মিল খুঁজে পাওয়া যায় নি *

হ্যালো
আমার প্রিয় বন্ধুটি
অনেক কিছুই
আমরা শেষের সাথে পার করব

* পাওয়া যায়নি *

Https://unix.stackexchange.com/a/405725/43233 - এর জন্য ধন্যবাদ - আমি এটি + সিড ছাড়ার বিকল্পটি ব্যবহার করছি।

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