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