मैं स्क्रिप्ट / उपनाम के साथ "foo.foo.foo" से कुछ पाठ बदलने के लिए bash / zsh कैसे प्राप्त कर सकता हूं?


11

मैं शायद का उपयोग कर सकते <या >या |। शायद मुझे grep का उपयोग करने की आवश्यकता है?


2
पाठ से आपका क्या अभिप्राय है? एक फ़ाइल या एक फ़ाइल में कुछ पाठ? echo "foo.foo.foo" | sed 's/\./ /g'
ज़ाना

1
@ केडीजी i) आपको प्रत्येक एसई साइट के लिए एक अलग खाता बनाने की आवश्यकता है, लेकिन यदि आप समान क्रेडेंशियल्स का उपयोग करते हैं, तो खाते लिंक किए जाएंगे। ii) जबकि यह साइट वास्तव में उबंटू तक ही सीमित है, मुझे यहां कुछ भी दिखाई नहीं देता है जो कि अकाट्य प्रमाण होगा कि आप उबंटू का उपयोग नहीं कर रहे हैं, इसलिए मैंने इसे बंद करने का कोई कारण भी नहीं देखा।
14

जवाबों:


20

आप एक समारोह बना सकते हैं और अपने अंत में जोड़ सकते हैं ~/.bashrc, उदाहरण के लिए:

nodot() {  echo "$1" | sed 's/\./ /g' ; }

उपयोग उदाहरण:

$ nodot foo.foo.foo
foo foo foo

आप इस फ़ंक्शन का उपयोग zsh में भी कर सकते हैं, बस ~/.zshrcइसके बजाय इसे जोड़ें ।


6
@tbodt एक स्वीकृत उत्तर को पूरी तरह से बदलने के लिए इसे किसी अन्य वर्तमान उत्तर के साथ बदलने के लिए बस नहीं किया जाता है।
मोरू

28

आप वर्ण परिवर्तित करने के लिए tr कमांड का उपयोग कर सकते हैं ।

% echo "foo.foo.foo" | tr '.' ' ' 
foo foo foo

शांत युक्तियाँ पहले कभी नहीं "tr" के बारे में सुना
केडीजी

6
trवास्तव में वास्तव में इस उद्देश्य के लिए है। sedओवरकिल है।
मैक्स राइड

1
+1 के लिए ठीक है tr, जो एक बहुत ही उपयोगी उपकरण है जो बहुत से लोगों को किसी कारण से पता नहीं लगता है। sedवर्णों के संपूर्ण वर्गों को परिवर्तित करने की तुलना में सरल है ।
शराबी

5
इसे कभी 'C' में न लिखें अगर आप इसे 'awk' में कर सकते हैं; कभी भी इसे do awk ’में न करें अगर 'sed’ इसे संभाल सकती है; कभी भी 'sed' का उपयोग न करें जब 'tr' काम कर सकता है; 'बिल्ली ’पर्याप्त होने पर कभी भी' त्र’ का आह्वान न करें; जब भी संभव हो Avoid बिल्ली ’का उपयोग करने से बचें। - टेलर के प्रोग्रामिंग के नियम
रॉस प्रेसर

1
अच्छा जवाब। यह उत्तर स्वीकार किया जाना चाहिए।
SuB

24

शुद्ध बैश का उपयोग करना:

bash-3.2$ a='a.a.a'
bash-3.2$ echo "${a/./ }"
a a.a
bash-3.2$ echo "${a//./ }"
a a a

9

Internal Field Separator (IFS)चर का उपयोग करना :

bash-4.3$ old_ifs=$IFS
bash-4.3$ IFS="."
bash-4.3$ var="foo.foo.foo"
bash-4.3$ echo $var
foo foo foo
bash-4.3$ IFS=$old_ifs

यह अच्छी तरह से एक समारोह में रखा जा सकता है:

split_dot()
{

    string="$1"

    if set | grep -q "IFS";
    then
       ifs_unset="false"
       old_ifs=$IFS
    else
       ifs_unset="true"
    fi

    IFS="."
    echo $string
    if [ "$ifs_unset" == "true" ];
    then
       unset IFS
    else
       IFS=$old_ifs
    fi
}

और जैसा चल रहा है:

bash-4.3$ split_dot "foo.baz.bar"                                                                             
foo baz bar

3
रीसेट IFSकरना एक चर में इसे बचाने और मूल्य को बहाल करने की तुलना में अधिक मुश्किल है। एक शुरुआत IFSऔर खाली IFSका अलग-अलग व्यवहार होता है, इसलिए आपको यह जाँचने की आवश्यकता है कि क्या यह पहले से खाली है या खाली है।
मूरू

5
उपधाराओं में कार्य नहीं चलते हैं। केवल कुछ चरों का अलग-अलग दायरा होता है (स्थितीय मानदंड, और कुछ अन्य जो gnu.org/software/bash/manual/html_node/Shell-Functions.html में सूचीबद्ध हैं )। इसलिए हमारे पास localकीवर्ड है।
मूरू

3
इसलिए यदि ओपी पहले IFSकिसी कारण से परेशान था , तो यह फ़ंक्शन इसे खाली करने के लिए सेट करेगा, जिसका व्यवहार अलग है।
मूरू

2
@fedorqui दुर्भाग्य से यह भी काम नहीं करेगा; चूंकि IFS मान वर्तमान स्टेटमेंट को पार्स किए जाने के लिए बहुत देर से सेट किया गया है। आपको वास्तव में एक उपखंड का उपयोग करना होगा (IFS=.; echo ...)। चूंकि इस उत्तर ने एक फ़ंक्शन का उपयोग किया, सर्ग सिर्फ ब्रेसिज़ को कोष्ठक में बदल सकता था और IFS को रीसेट करने के बारे में चिंता नहीं करता
muru

2
@fedorqui आपको U & L पर मेरा ऐसा ही सवाल दिलचस्प लग सकता है: unix.stackexchange.com/q/264635/70524 (गाइल्स हमेशा बहुत अच्छे जवाब देते हैं)
muru

4

किसी को भी याद किया awk/ perl/ python/ go:


% awk '{gsub(/[.]/, " ", $0); print}' <<<'foo.foo.foo'                      
foo foo foo

% perl -pe 's/\./ /g' <<<'foo.foo.foo'                                      
foo foo foo

% python -c 'import sys; print sys.stdin.read().replace(".", " ")' <<<'foo.foo.foo'
foo foo foo

% cat input.go
package main

import (
    "os"
    "strings"
    "fmt"
)

func main () {
    args := os.Args
    if len(args) != 2 {
        fmt.Println("Not enough arguments")
        return
    }
    out := strings.Replace(args[1], ".", " ", -1)
    fmt.Println(out)
}

% go run input.go 'foo.foo.foo' 
foo foo foo

1

एक xargsभी उपयोग कर सकते हैं । यहां एक-लाइनर का उपयोग किया गया हैxargs

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