línea de comando de shell línea de entrada cambiar coma a espacio

línea de comando de shell línea de entrada cambiar coma a espacio

Tengo un script simple que toma 4 variables de la "lectura" del teclado interactivo, sin embargo, mi comando tiene una coma. Leí el valor del separador IFS, pero los ejemplos solo muestran que se lee desde archivos, no desde la entrada del teclado. ¿Existe algún truco para cambiar la entrada o necesito canalizar el comando a través de SED/AWK para que tenga el formato correcto para que lo lea el script?

El script no es nada sofisticado, solo ingresa texto, agrega el valor de entrada y repite las cadenas de comando que se pueden ejecutar con el texto ingresado.

[red] [tarjeta],[puerto] [nombre de host] 0123 0123,A1 ABCDEFG

#!/bin/bash
echo "Enter network info:"
read VAR1 VAR2 VAR3 VAR4
#I have no clue what Im doing

echo -e "${green}ping test and ssh into $VAR4${NC}"

Respuesta1

Para tratar una coma como separador de palabras, intente:

IFS="$IFS," read a b c d

Esto agrega temporalmente una coma a IFS, que es la lista de caracteres que el shell usa para los separadores de campos.

Como ejemplo, recopilemos algunos comentarios:

$ IFS="$IFS," read a b c d
1, 2,3 , 4

Veamos cómo bash interpretó esa entrada:

$ echo "a=$a b=$b c=$c d=$d"
a=1 b=2 c=3 d=4

Mejora

Podemos combinar el mensaje y el comando de lectura:

IFS="$IFS," read -p "Enter network info: " a b c d

Documentación

De man bash:

IFS
El separador de campo interno que se utiliza para dividir palabras después de la expansión y para dividir líneas en palabras con el comando incorporado de lectura. El valor predeterminado es <space><tab><newline>

Alternativa

Si, por alguna razón no especificada, uno realmente quisiera utilizar sedpara esta tarea:

read -p "Enter network info: " a b c d < <(sed 's/,/ /g; q')

El comando s/,/ /gle dice a sed que reemplace cada coma con un espacio. qle dice que salga después de la primera línea.

El solitario <indicaredirección: le dice al shell que obtenga su entrada para el readcomando del objeto similar a un archivo que sigue a la línea de comando.

La construcción <(...)se llamasustitución de procesosy crea un objeto similar a un archivo a partir del comando contenido en los pares. Ese comando es el sedcomando que reemplaza las comas con espacios.

Para el mismo enfoque pero usando con awk:

read -p "Enter network info: " a b c d < <(awk '{gsub(/,/, " "); print; exit}')

información relacionada