Agregar pausas entre cada dos palabras en bash

Mi consulta es:

QUERY="SELECT 'Your Name:', FullName, 'Your Phone:', Phone, 'Email:', Email FROM Table1 JOIN WHERE EmpID=001;" 

El resultado que obtengo es:

 Your Name: Samanta Your Phone: 111-111-1111 Email: testemail@test.com 

Pero quiero esta salida cuando imprimo:

 Your Name: Samanta Your Phone: 111-111-1111 Email: testemail@test.com 

Intenté esto:

salida = executeSQLQuery "$QUERY" | tr -c ' ' '\n' executeSQLQuery "$QUERY" | tr -c ' ' '\n'

No está trabajando.

Soy nuevo en bash y SQL. Por favor, ayúdame.

 output=executeSQLQuery "$QUERY" |sed 's/: [^ ]* /& \n/g' 

El command anterior rinde

 user@user:~> z="Your Name: Samanta Your Phone: 111-111-1111 Email: testemail@test.com" user@user:~> echo $z | sed 's/: [^ ]* /& \n/g' Your Name: Samanta Your Phone: 111-111-1111 Email: testemail@test.com user@user:~> 

El command ha usado la coincidencia de expresiones regulares, es decir, dos puntos (':') seguidos de un espacio y luego todos los caracteres que no sean espacios. Sin embargo, si los datos contienen algún carácter de espacio, este command fallará miserablemente.

Esto parece un problema XY. Dice que quiere agregar un descanso entre cada dos palabras, pero lo que realmente quiere hacer es imprimir muy bien los datos devueltos por una consulta SQL.

Su problema es causado por el hecho de que su function executeSQLQuery (o script o progtwig) devuelve salida formateada en lugar de solo los datos … y parece que lo está haciendo porque su cadena de $ QUERY lo está diciendo.

¿Puede get executeSQLQuery o una function / script relacionada para devolver solo los datos en un formatting fácilmente analizado (como CSV o delimitado por tabuladores), sin encabezados de columna?

(en otras palabras, "No hagas eso, entonces". Separe la presentación de los resultados de la recostackción de datos)

Si eso es posible, podría usar printf para formatear los datos como prefiera. por ejemplo, usando salida delimitada por tabuladores y una matriz de bash:

 QUERY="SELECT FullName, Phone, Email FROM Table1 WHERE EmpID=001;" # disable globbing which would otherwise be performed upon non-quoted # command substitution (except in zsh): set -f # set the input-field-separator to tab and newline (but not space characters) # execute the query and store the results in the array $output IFS=$'\t\n' output=($(executeSQLQuery "$QUERY")) # now print the output array in the format we want. printf "Your Name: %s\nYour Phone: %s\nEmail: %s\n" "${output[@]}" 

Aquí hay un ejemplo de trabajo usando mysql. No sé cuál es tu executeSQLQuery , pero acabo de hacer una database de testing mysql (llamada 'basura'), la he poblado con tus datos de ejemplo y executeSQLQuery definido executeSQLQuery como una function así:

 $ executeSQLQuery() { mysql --batch --silent junk -e "$@" ;} 

Tenga en count las opciones --batch y --silent . Le dicen a mysql que me brinde solo los datos sin encabezados u otro formatting. No he usado las opciones -u y -p para usuario y contraseña porque creé un file ~ / .my.cnf con mis cnetworkingenciales.

Ahora, ejecutemos la consulta, mostremos qué contiene la matriz de salida y luego imprimamos con printf.

 $ set -f; IFS=$'\t\n' output=($(executeSQLQuery 'Select Fullname,Phone, Email from Table1 where EmpId = 001')) $ set | grep output output=([0]="Samantha" [1]="111-111-1111" [2]="testemail@test.com") $ printf "Your Name: %s\nYour Phone: %s\nEmail: %s\n" "${output[@]}" Your Name: Samantha Your Phone: 111-111-1111 Email: testemail@test.com 

Por cierto, bash no es compatible con matrices multidimensionales, por lo que si tu consulta devuelve varias filas, tendrás que escribir algún tipo de ciclo para imprimir [0..2], [3..5], [6 .. 8] y así sucesivamente como loggings separados. Por ejemplo, agregué un segundo logging a la Tabla 1 y cambié la consulta para devolver todas las filas … así es como se ve la matriz de salida ahora:

 $ set -f; IFS=$'\t\n' output=($(executeSQLQuery 'Select Fullname,Phone, Email from Table1')) $ set | grep output output=([0]="Samantha" [1]="111-111-1111" [2]="testemail@test.com" [3]="Fnetworking" [4]="222-222-2222" [5]="testemail2@test.com") 

En general, sin embargo, es mucho más fácil hacer trabajo de database en Perl con la biblioteca de DBI. Si no estás comprometido a trabajar en Bash por alguna razón, te recomiendo comenzar a aprender perl.

El problema con la salida es que le gustaría agrupar tres palabras (aunque lógicamente pares key-valor) en la primera línea de salida, otras tres en la siguiente y dos últimas en la tercera línea.

Para este problema en particular, la forma más rápida sería:

 executeSQLQuery "$QUERY" | awk '{print $1 " " $2 " " $3 "\n" $4 " " $5 " " $6 "\n" $7 " "$8 }' 

Pero, en general, sería mejor cambiar la consulta a algo así como:

 SELECT FullName as 'Your name', Phone as 'Your phone', Email FROM Table1 WHERE EmpID=001; 

y luego get la fila junto con los nombres de columna y crear la salida deseada en Perl u otro idioma.