¿Cómo puedo hacer que bash / zsh cambie un texto de "foo.foo.foo" a "foo foo foo" con un script / alias?

11

Tal vez pueda usar <o >o |. Tal vez necesito usar grep?

KDG
fuente
2
¿Qué quieres decir con un texto? un archivo o algo de texto en un archivo? echo "foo.foo.foo" | sed 's/\./ /g'
Zanna
1
@KDG i) necesita crear una cuenta separada para cada sitio de SE, pero si usa las mismas credenciales, las cuentas se vincularán. ii) Si bien este sitio está limitado exclusivamente a Ubuntu, no veo nada aquí que sea una prueba irrefutable de que no está utilizando Ubuntu, por lo que tampoco tengo motivos para cerrarlo.
Terdon

Respuestas:

20

Puede hacer una función y agregarla al final de su ~/.bashrc, por ejemplo:

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

ejemplo de uso:

$ nodot foo.foo.foo
foo foo foo

También puede usar esta función en zsh, solo agregue a su ~/.zshrclugar.

Zanna
fuente
66
@tbodt cambiar una respuesta aceptada para reemplazarla completamente con otra respuesta actual simplemente no se hace.
muru
28

Puede usar el comando tr para convertir caracteres.

% echo "foo.foo.foo" | tr '.' ' ' 
foo foo foo
Validus Oculus
fuente
consejos geniales nunca antes oyeron hablar de "tr"
KDG
66
tren realidad está destinado exactamente para este propósito. sedEs exagerado.
Max Ried
1
+1 precisamente para tr, que es una herramienta muy útil que muchas personas no parecen conocer por alguna razón. Mucho más simple que sedpara convertir clases enteras de personajes.
esponjoso
55
Nunca lo escriba en 'C' si puede hacerlo en 'awk'; Nunca lo hagas en 'awk' si 'sed' puede manejarlo; Nunca use 'sed' cuando 'tr' pueda hacer el trabajo; Nunca invoque 'tr' cuando 'cat' sea suficiente; Evite usar 'gato' siempre que sea posible. --Las leyes de programación de Taylor
Ross Presser
1
Buena respuesta. Esta respuesta debe ser aceptada.
SuB
24

Usando bash puro:

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

Usando Internal Field Separator (IFS)variable:

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

Esto se puede poner muy bien en una función:

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
}

Y corre así:

bash-4.3$ split_dot "foo.baz.bar"                                                                             
foo baz bar
Sergiy Kolodyazhnyy
fuente
3
Restablecer IFSes más complicado que simplemente guardarlo en una variable y restaurar el valor. Un desarmado IFSy un vacío IFStienen un comportamiento diferente, por lo que debe verificar si está desarmado o simplemente vacío, en caso de que estuviera vacío antes.
Muru
55
Las funciones no se ejecutan en subcapas. Solo algunas variables tienen un alcance diferente (los parámetros posicionales, y algunas otras se enumeran en gnu.org/software/bash/manual/html_node/Shell-Functions.html ). Por eso tenemos la localpalabra clave.
muru
3
Entonces, si OP se había desarmado IFSpor alguna razón anteriormente, esta función lo configuraría como vacío, lo que tiene un comportamiento diferente.
muru
2
@fedorqui desafortunadamente incluso eso no funcionará; dado que el valor IFS se establece demasiado tarde para que se analice la declaración actual. Tendría que usar una subshell (IFS=.; echo ...). Dado que esta respuesta utilizaba una función, Serg podría simplemente cambiar los paréntesis a paréntesis y no preocuparse por restablecer IFS en absoluto
muru
2
@ fedorqui puede encontrar interesante mi pregunta similar sobre U&L: unix.stackexchange.com/q/264635/70524 (Gilles siempre da muy buenas respuestas)
muru
4

Alguien se perdió 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
heemayl
fuente
1

Uno puede usar xargstambién. Aquí hay una línea usandoxargs

$ echo "foo.foo.foo" | xargs -d .
foo foo foo
souravc
fuente