2012-05-23 17 views
5

Aquí hay una secuencia de comandos que lee palabras del archivo replace.txt y muestra el resultado de cada palabra en cada línea, pero quiero mostrar todas las salidas en una sola línea.¿Cómo obtener salida de grep en una sola línea en el script de shell?

 
#!/bin/sh 
echo 
echo "Enter the word to be translated" 
read a 
IFS=" "  # Set the field separator 
set $a  # Breaks the string into $1, $2, ... 
for a # a for loop by default loop through $1, $2, ... 
    do 
    { 
    b= grep "$a" replaced.txt | cut -f 2 -d" " 
    } 
    done 

contenido del archivo "replaced.txt" se da a continuación:

 
hllo HELLO 
m AM 
rshbh RISHABH 
jn JAIN 
hw HOW 
ws WAS 
ur YOUR 
dy DAY 

Esta pregunta no puede ser apropiado a lo que le pedía, sólo necesito la ayuda para poner la salida de la secuencia de comandos en una sola linea

+0

Tu script está incompleto. ¿Dónde está la instrucción 'echo' (o' printf')? Las llaves son redundantes con 'do' /' done'. Solo necesitas uno o el otro. –

Respuesta

9

toda su script puede ser reemplazado por:.

#!/bin/bash 
echo 
read -r -p "Enter the words to be translated: " a 
echo $(printf "%s\n" $a | grep -Ff - replaced.txt | cut -f 2 -d ' ') 

No hay necesidad de un bucle.

El echo con un argumento sin comillas elimina las líneas nuevas incrustadas y reemplaza cada secuencia de múltiples espacios y/o pestañas con un espacio.

2

Una manera pequeña pero simple de eliminar las nuevas líneas del final de un comando es envolverlo en printf %s "$(...) ". Es decir, puede cambiar esto:

b= grep "$a" replaced.txt | cut -f 2 -d" " 

a esto:

printf %s "$(grep "$a" replaced.txt | cut -f 2 -d" ") " 

y añadir un comando echo después del bucle finaliza.

La notación $(...) establece una "sustitución de comando": el comando grep "$a" replaced.txt | cut -f 2 -d" " se ejecuta en una subshell, y su resultado, menos las nuevas líneas finales, se sustituye en la lista de argumentos. Así, por ejemplo, si las salidas de comando DAY, a continuación, lo anterior es equivalente a esto:

printf %s "DAY " 

(La notación printf %s ... es equivalente a echo -n ... — se da salida a una cadena sin añadir un salto de línea final — excepto que su comportamiento es más portable consistente, y no va a portarse mal si la cadena que desea imprimir pasa a comenzar con -n o -e o lo que sea)

1

También puede utilizar

awk 'BEGIN { OFS=": "; ORS=" "; } NF >= 2 { print $2; }' 

en una tubería después del corte.

Cuestiones relacionadas