Puedo hacer cat file.txt
para obtener el contenido de un archivo, pero también quiero agregar una línea final de mi elección.
Traté de tuberías (cat file.txt ; echo "My final line") |
pero solo la línea final pasa a través de la tubería. ¿Cómo puedo unirme al gato y a la línea final?
Edite para un punto de aclaración: no deseo modificar el archivo en sí. Soy consciente de que si este fuera el caso, podría hacerlo echo "My final line" >> file.txt
o echo "My final line" | tee -a file.txt
solo estoy tratando de hacer el anexo dentro del contexto de este comando en particular para poder canalizar la concatenación de file.txt
y "My final line"
.
command-line
pipe
cat
echo
Contrabajo
fuente
fuente
echo "My final line" >> file.txt
?>>
si quisiera editar el archivo en sí.file.txt
? Su fragmento de tubería debería funcionar.Respuestas:
Puede aprovechar
cat
la capacidad de leer de stdin combinada con su capacidad de leer múltiples archivos para lograr esto.También puede anteponer una línea, como tal:
Tenga en cuenta que no está limitado a una sola línea.
cat
leerá desde stdin hasta que llegue a EOF. Puede pasar la salida decurl
, por ejemplo, para anteponer o agregar a la salida decat
.fuente
(cat file.txt ; echo "My final line") | …
También lo haría. Pero usarcat
para lo que fue diseñado es mejor +1.echo "$$" "$BASHPID" | head -q -n 1 /proc/mounts - | cat
vs.( head -q -n 1 /proc/mounts; echo "$$" "$BASHPID" ) | cat
o incluso{ head -q -n 1 /proc/mounts; echo "$$" "$BASHPID"; } | cat
.Para agregar una línea a un archivo, puede usar el operador de redirección de adición de shell,
>>
(el archivo se agregará con unaopen(2)
marcaO_APPEND
):Ahora, si solo desea ver el contenido del archivo con una línea final agregada, lo usaría
cat
con dos argumentos:file.txt
cat
solo trata con archivos) puede aprovechar la sustitución del proceso<()
, que devolvería un descriptor de archivo (/proc/self/fd/<fd_number>)
.Poniendo estos juntos:
Si desea que la salida sea paginada, suponiendo que
less
sea su localizador favorito:fuente
<()
funciona para bash, pero ¿para qué otros proyectiles funciona? Ksh? ¿Guión?ksh
,zsh
- Sí,dash
- No.De
man sed
la opción-e
$
coincide con la última línea ya
agrega la cadena.Si desea agregar permanentemente la línea al archivo, use
-i
Cambiar el comando a
fuente
Ya se aclaró en los comentarios a la pregunta, pero se agregó nuevamente como respuesta aquí.
El comando anotado en la pregunta,
funciona como se espera: toda la salida del subshell formado por paréntesis se canaliza al segundo comando.
Si el archivo no termina con una nueva línea, la cadena con eco se agrega a la última línea; esto es común con todas las otras soluciones aquí, y se puede resolver agregando otro eco (vacío) antes.
fuente
awk
:awk 1 file.txt; echo "My final line"
.awk 1 file
es un buen truco para compensar la falta de EOL al final del archivo.echo "\nMy final line"
sin tener que depender de élawk