Come posso ottenere bash / zsh per cambiare del testo da “foo.foo.foo” a “foo foo foo” con uno script / alias?


11

Posso forse usare <o >o |. Forse devo usare grep?


2
Cosa intendi con un testo? un file o del testo in un file? echo "foo.foo.foo" | sed 's/\./ /g'
Zanna,

1
@KDG i) è necessario creare un account separato per ciascun sito SE, ma se si utilizzano le stesse credenziali, gli account verranno collegati. ii) Anche se questo sito è limitato esclusivamente a Ubuntu, non vedo nulla qui che sia una prova inconfutabile che non stai usando Ubuntu, quindi non vedo alcun motivo per chiuderlo.
terdon,

Risposte:


20

Puoi creare una funzione e aggiungerla alla fine ~/.bashrc, ad esempio:

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

esempio di utilizzo:

$ nodot foo.foo.foo
foo foo foo

Puoi usare questa funzione anche in zsh, basta aggiungerla al tuo ~/.zshrc.


6
@tbodt non è possibile modificare una risposta accettata per sostituirla completamente con un'altra risposta corrente.
Muru,

28

È possibile utilizzare il comando tr per convertire il carattere.

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

suggerimenti interessanti non hanno mai sentito parlare di "tr" prima
KDG

6
trè in realtà pensato proprio per questo scopo. sedè eccessivo.
Max Ried,

1
+1 proprio per tr, che è uno strumento molto utile che molte persone non sembrano conoscere per qualche motivo. Molto più semplice rispetto sedalla conversione di intere classi di caratteri.
soffice

5
Non scriverlo mai in 'C' se puoi farlo in 'awk'; Non farlo mai in 'awk' se 'sed' può gestirlo; Non usare mai 'sed' quando 'tr' può fare il lavoro; Non invocare mai "tr" quando "cat" è sufficiente; Evita di usare "cat" quando possibile. - Le leggi di programmazione di Taylor
Ross Presser,

1
Bella risposta. Questa risposta dovrebbe essere accettata.
SuB,

24

Utilizzando pure bash:

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

9

Utilizzando Internal Field Separator (IFS)variabile:

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

Questo può essere messo bene in una funzione:

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
}

Ed esegui così:

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

3
Il ripristino IFSè più complicato del semplice salvataggio in una variabile e ripristino del valore. Un non impostato IFSe uno vuoto IFShanno un comportamento diverso, quindi è necessario verificare se non è impostato o è vuoto, nel caso in cui fosse vuoto prima.
Muru,

5
Le funzioni non vengono eseguite nei sottotitoli. Solo alcune variabili hanno un ambito diverso (i parametri posizionali e alcune altre sono elencate in gnu.org/software/bash/manual/html_node/Shell-Functions.html ). Ecco perché abbiamo la localparola chiave.
Muru,

3
Quindi se OP fosse stato disattivato IFSper qualche motivo in precedenza, questa funzione lo avrebbe impostato su vuoto, il che ha un comportamento diverso.
Muru,

2
@fedorqui purtroppo anche questo non funzionerà; poiché il valore IFS è impostato troppo tardi per l'istruzione corrente da analizzare. Dovresti effettivamente usare una subshell (IFS=.; echo ...). Poiché questa risposta utilizzava una funzione, Serg poteva semplicemente cambiare le parentesi graffe tra parentesi e non preoccuparsi di ripristinare l'IFS
muru

2
@fedorqui potresti trovare interessante la mia domanda simile su U&L: unix.stackexchange.com/q/264635/70524 (Gilles dà sempre risposte molto buone)
muru

4

Chiunque ha perso 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

Si può usare xargsanche. Ecco un one-liner usandoxargs

$ echo "foo.foo.foo" | xargs -d .
foo foo foo
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.