web-dev-qa-db-fra.com

Ajouter une ligne à un fichier dans la commande cat?

Je peux faire cat file.txt pour obtenir le contenu d'un fichier, mais je veux aussi clouer sur une dernière ligne de mon choix.

J'ai essayé la tuyauterie (cat file.txt ; echo "My final line") | mais seule la dernière ligne passe dans le tuyau. Comment puis-je rejoindre le chat et la dernière ligne?

Éditer pour clarifier: je ne souhaite pas modifier le fichier lui-même. Je sais que si tel était le cas, je pourrais utiliser echo "My final line" >> file.txt ou echo "My final line" | tee -a file.txt, mais je n’essaie d’ajouter que dans le contexte de cette commande afin que je puisse diriger la concaténation de file.txt et "My final line".

11
DoubleBass

Vous pouvez tirer parti de la capacité de cat à lire à partir de stdin, combinée à sa capacité à lire plusieurs fichiers pour y parvenir.

~$ cat file.txt
Hello from file.txt

~$ echo "My final line" | cat file.txt -
Hello from file.txt
My final line

Vous pouvez également ajouter une ligne en tant que telle:

~$ echo "My final line" | cat - file.txt
My final line
Hello from file.txt

Notez que vous n'êtes pas limité à une seule ligne. cat lira à partir de stdin jusqu'à ce qu'il atteigne EOF. Vous pouvez transmettre la sortie de curl, par exemple, à ajouter ou ajouter à la sortie de cat.

~$ curl -s http://perdu.com | cat file.txt -
Hello from file.txt
<html><head><title>Vous Etes Perdu ?</title></head><body><h1>Perdu sur l'Internet ?</h1><h2>Pas de panique, on va vous aider</h2><strong><pre>    * <----- vous &ecirc;tes ici</pre></strong></body></html>
29
Mathieu Mitchell
sed -e '$aMy final line' file.txt

De man sed l'option -e

-e script, --expression=script
    add the script to the commands to be executed

$ correspond à la dernière ligne et a ajoute la chaîne.

Si vous souhaitez ajouter définitivement la ligne au fichier, utilisez -i

-i[SUFFIX], --in-place[=SUFFIX]
    edit files in place (makes backup if SUFFIX supplied)

Changer la commande en

sed -i -e '$aMy final line' file.txt
11
Katu

Pour ajouter une ligne à un fichier, vous pouvez simplement utiliser l'opérateur de redirection d'ajout Shell, >> (le fichier sera open(2)- ed avec l'indicateur O_APPEND):

echo 'My final line' >>file.txt

Maintenant, si vous voulez juste voir le contenu du fichier avec une dernière ligne ajoutée, j'utiliserais cat avec deux arguments:

  • Tout d’abord, votre fichier évidemment, disons file.txt
  • Le deuxième argument serait la chaîne de votre choix, et pour passer la chaîne en tant que nom de fichier (car cat ne traite que des fichiers), vous pouvez utiliser la substitution de processus, <(), qui renverrait un descripteur de fichier (/proc/self/fd/<fd_number>).

Mettre ensemble ces:

cat file.txt <(echo 'My final line')

Si vous souhaitez que la sortie soit paginée, supposez que less est votre pageur préféré:

less file.txt <(echo 'My final line')
8
heemayl

Cela a déjà été clarifié dans les commentaires de la question, mais en l'ajoutant à nouveau comme réponse ici.

La commande a noté dans la question,

(cat file.txt ; echo "My final line") | other command

fonctionne comme prévu - toute la sortie du sous-shell formé par les parenthèses est transmise à la deuxième commande.

Si le fichier ne se termine pas par une nouvelle ligne, la chaîne en écho est ajoutée à la dernière ligne - ceci est commun à toutes les autres solutions ici, et peut être résolu en ajoutant un autre écho (vide) avant.

7
Paŭlo Ebermann