2012-01-16 18 views
14

así que estoy tratando de hacer algo como lo siguiente:Leer la entrada estándar para la entrada del usuario cuando ya hay un archivo redirigido a la entrada estándar

while read line; do 
    read userInput 
    echo "$line $userInput" 
done < file.txt 

Así que decir tiene archivo.txt:

Hello? 
Goodbye! 

de reproducción el programa crearía:

Hello? 
James 
Hello? James 
Goodbye! 
Farewell 
Goodbye! Farewell 

la cuestión (naturalmente) se hace que la lectura userinput lee de la entrada estándar, que en nuestro caso es file.tx t. ¿Hay alguna manera de cambiar dónde está leyendo de manera temporal a la terminal para obtener la entrada del usuario?

Nota: El archivo con el que estoy trabajando tiene 200,000 líneas de longitud. y cada línea tiene aproximadamente 500 caracteres de largo. Así que ten esto en cuenta si es necesario

Respuesta

24

En lugar de utilizar la redirección, puede abrir file.txt a un descriptor de archivo (por ejemplo 3) y utilizar read -u 3 para leer desde el archivo en lugar de desde stdin:

exec 3<file.txt 
while read -u 3 line; do 
    echo $line 
    read userInput 
    echo "$line $userInput" 
done 

Alternativamente , según lo sugerido por Jaypal Singh, esto puede escribirse como:

while read line <&3; do 
    echo $line 
    read userInput 
    echo "$line $userInput" 
done 3<file.txt 

la ventaja de esta versión es que también trabaja en sh (la opción de -uread no funciona en sh).

+1

@jcollado Aunque tengo una pequeña sugerencia, en lugar de hacer 'exec' en una línea separada, puede escribirla así' 'mientras lee la línea <& 3; hacer eco $ línea; leer userInput; echo "$ line $ userInput"; hecho 3

+0

Ok, veo, no puedo eliminar una respuesta aceptada:/ – miku

+0

@miku Como lo permitiste lo cambié. –

Cuestiones relacionadas