मैं मैच को कैसे हटाऊं और केवल विशिष्ट चरित्र को सेड के साथ बदलूं


0

मैं sed'0' को 'सही' शब्द से बदलने की कोशिश कर रहा हूं (मैं echo $?अपनी स्क्रिप्ट को मान्य करने के लिए उपयोग कर रहा हूं और मैं आउटपुट को बदलना चाहता हूं echo)। समस्या यह है कि मेरे पास आउटपुट फ़ाइल में अधिक पाठ है और sedसब कुछ बदल रहा है और न कि केवल "0"।

उदाहरण के लिए:

some command
echo ``date` `>> "file"
echo $? >> "file"
sed -i 's/0/correct/g' /"file"

किसी भी विचार मैं यह कैसे काम कर सकता है?

EDIT 1 13.02.2014

आउटपुट echo $?"0" है (जो मुझे पता है कि 0 का अर्थ है सब कुछ ठीक है)।

अगली बात यह है कि sed -i 's/0/correct/g' /"file"(मैंने अभी उपयोग किया "" क्योंकि कोई इसे विशिष्ट नाम के साथ गलत व्याख्या कर सकता है)।

यहाँ स्क्रिप्ट का हिस्सा है:

echo `date` | cat >> /file.txt
echo $? | cat >> /file.txt
sed -i 's/0/correct/g' /file.txt

-i माध्यम:

   text   Insert text, which has each embedded newline preceded by a backslash.

जवाबों:


1

आपके कोड स्निपेट से, sedअभिव्यक्ति सही दिखती है - यह हर '0' अक्षर को 'सही' अक्षर से बदल देगी। यदि आप केवल यह चाहते हैं कि आपकी echoकमांड से आउटपुट अपडेट हो, तो आप उदाहरण sedसे आउटपुट पर कमांड डाल सकते हैं echo:

कुछ आदेश
दिनांक >> /file.txt
इको $? | sed 's / 0 / सही /' >> /file.txt

('इको' और 'कैट' कमांड हटाने पर आउटपुट पर कोई प्रभाव नहीं पड़ेगा)

आप जिस -iविकल्प का उपयोग कर रहे हैं, उसके संदर्भ में , यह वास्तव में एक कमांडलाइन विकल्प है, sedस्क्रिप्ट कमांड के बजाय - यह manपृष्ठ में एक अलग अनुभाग है :

       -i [SUFFIX], -इन-जगह [= SUFFIX]

          फ़ाइलों को जगह में संपादित करें (यदि एक्सटेंशन आपूर्ति हो तो बैकअप बनाता है)

इसका मतलब है कि यह स्रोत फ़ाइल को अपडेट करेगा (जो आपके उदाहरण में ठीक वही है जो आप चाहते हैं)।

हालाँकि, ध्यान दें कि इस उदाहरण में, बाहर निकलने वाले कोड की जाँच की जा रही है dateऔर आपका आदेश नहीं है। वास्तव में आपके उदाहरण में, यह बाहर निकलने के कोड की जांच कर echoरहा है, जिसके बारे में मुझे संदेह है कि यह आपके लिए और भी कम सहायक है।

इस जाँच को करने का एक और मानक तरीका निम्न के साथ होगा:

कुछ आदेश
परिणाम = $?
दिनांक >> /file.txt
अगर [$ परिणाम -eq 0]
फिर
  इको "कमांड सफलतापूर्वक समाप्त" >> /file.txt
अन्य
  इको "कमांड एक्जिट कोड $ परिणाम के साथ विफल रहा" >> /file.txt
फाई

जैसा कि आपका कोड बताता है, हर 0 को शब्द सही से बदल दिया गया था | थू 13 फरवरी 2014 19:13:45 GMT> थू 13 फ़र 2correct14 19:13:45 GMT
user299930

मैं जो चाहता हूं, वह केवल 0 को बदलना है जो गूंज $ के साथ जोड़ा गया था? तारीख और समय में 0 नहीं। मैं केवल 0 को प्रतिस्थापित करने के लिए sed सेट करना चाहता हूं और 2014, 20:00 और इतने पर बाहर कर दूंगा।
user299930 19

0

यदि आप केवल '0' वाली लाइनों को बदलना चाहते हैं और कुछ नहीं, तो उपयोग करें:

sed -i 's/^0$/correct/g' file.txt

क्रमशः रेखा के आरंभ और अंत को इंगित करने वाले विशेष वर्ण कहाँ ^और कहाँ $हैं।

एक संभावित समस्या यह हो सकती है कि फ़ाइल में कोई अन्य पंक्तियाँ हैं जिनमें केवल '0' है, न कि केवल $?रिटर्न मान। इसे बेहतर बनाने का एक तरीका यह होगा कि आप अधिक से अधिक प्रिंट करें $?:

echo RETVAL: $?

और फिर बाद में इस स्ट्रिंग से मिलान करें:

sed -i 's/^RETVAL: 0$/correct/g' file.txt

0

यदि आपको वास्तव में आउटपुट फ़ाइल के माध्यम से खोज करने और उसमें परिवर्तन करने की आवश्यकता नहीं है, तो यह आसान होगा कि आप इसे पहली बार में लिखें।

स्क्रिप्ट के इस बिट के साथ, यदि कमांड सफल है और एक से बाहर निकलें कोड देता है "0", तो "correct"आपकी फ़ाइल पर लिखा जाएगा "/file.txt":। यदि कमांड किसी अन्य निकास कोड को वापस करता है, तो उस निकास कोड (संख्या) को आपकी फ़ाइल में लिखा जाएगा।

some command
r=$?
[ $r -eq 0 ] && r="correct"
echo "`date` $r" >> /file.txt

नोट: यह दिनांक, और आपके संदेश ("सही") को उसी पंक्ति में आउटपुट करेगा, जिसे आप चाहते थे। यदि आप एक लाइन पर तारीख, और अपनी लाइन पर अपना संदेश चाहते हैं, तो इसे दो इको कमांड की तरह बदलें:

some command
r=$?
[ $r -eq 0 ] && r="correct"
echo `date` >> /file.txt
echo $r >> /file.txt

दो (कम से कम) दो अन्य संभावनाएं हैं जिन्हें आप पूरा करने की कोशिश कर रहे हैं:

सबसे पहले, अगर आप केवल फ़ाइल को लिखना चाहते हैं यदि कमांड सफल है (एक निकास कोड लौटाता है "0")। यह "correct"आपकी फ़ाइल को सफलता पर लिखेगा , लेकिन अन्यथा, यदि कोई अन्य निकास कोड वापस आ जाता है, तो आपकी फ़ाइल पर कुछ भी नहीं लिखा जाएगा:

some command
[ $? -eq 0 ] && echo "`date` correct" >> /file.txt

या, यदि आप सभी एग्जिट कोड की पहचान करना चाहते हैं जहां एग्जिट कोड "0""सही" के बराबर होता है, और कोई अन्य एग्जिट कोड "एरर" के बराबर होता है, तो:

some command
r=$?
if [ $r -eq 0 ]; then
    r="correct"
else
    r="error: exit code $r"
fi
echo "`date` $r" >> /file.txt
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.