¿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?


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.


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

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

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

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

1

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

$ echo "foo.foo.foo" | xargs -d .
foo foo foo
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.