Sed कमांड का उपयोग करने पर मुझे निकास की स्थिति कैसे मिलती है?


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.*$//'सही ढंग से निष्पादित किया गया था। इसने सभी लाइनों को हटा दिया pop। यह नहीं था कि इस तरह की लाइनें अप्रासंगिक नहीं थीं, फिर भी कमांड ने काम किया।
टेराडॉन

@ मैं एक जवाब पोस्ट करने जा रहा था, लेकिन मुझे लगा कि यह वास्तव में सवाल का जवाब नहीं देता है। यह केवल एक गलत धारणा की व्याख्या करता है, लेकिन स्टीलड्राइवर की तरह एक उपयोगी समाधान प्रदान नहीं करता है। इसलिए एक टिप्पणी अधिक उपयुक्त लगी।
टेराडॉन

जवाबों:


13

आप बाहर निकलने की स्थिति के साथ छोड़ने के लिए q n का उपयोग कर सकते हैं n - लेकिन उस उपयोगी को बनाने के लिए, आपको कुछ शाखा और प्रवाह नियंत्रण का उपयोग करने की भी आवश्यकता होगी :

टी
शाखा सशर्त रूप से (वह है: एक लेबल पर कूदें) केवल तभी जब कोई s/// कमांड अंतिम इनपुट लाइन पढ़ने या दूसरी सशर्त शाखा ले जाने के बाद सफल हुई हो।

N के लिए एक मान चुनना शायद सबसे अच्छा है जो मानक निकास स्थिति मूल्यों में से एक से अलग है:

शून्य से बाहर निकलने की स्थिति सफलता को इंगित करती है, और एक नॉनजरो मूल्य विफलता को इंगित करता है। GNU 'sed' निम्न निकास स्थिति त्रुटि मान लौटाता है:

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

यदि कोई मैच नहीं मिला , तो sed के साथ रेगेक्स की खोज करें, और माचिस को हाइलाइट करें , या बाहर निकलें कोड (5) वापस करें :

यह input.txt है:

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' "$@"
}

$ हाइलाइट "lo \ _ end" input.txt || इको-ई "\ n * कोई मैच नहीं मिला *"

HEL लो वहाँ
मेरे प्रिय पुराने शुक्र अंत
एक लो चीजों की टी
हम एक पास भेज देंगे लो एनजी अंत

जब कोई मिलान नहीं होता है, तो यह निकास कोड (5) लौटाएगा। आप इसे बिल्ली और पाइप के साथ उपयोग कर सकते हैं | भी:

$ बिल्ली input.txt | हाइलाइट करें "हॉट \" और "|| इको-ई "\ n * कोई मैच नहीं मिला *"

नमस्ते वहाँ
मेरे प्यारे पुराने दोस्त
बहुत सारी चीजें
हम अंत तक साथ देंगे

* कोई मेल नहीं मिला *

Https://unix.stackexchange.com/a/405725/43233 के लिए धन्यवाद - मैं इसका इस्तेमाल कर रहा हूँ + sed विकल्प छोड़ें।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.