Existe-t-il une commande Unix pour ajouter des données de chaîne à un fichier texte?
Quelque chose comme:
prepend "to be prepended" text.txt
sed -i.old '1s;^;to be prepended;' inFile
-i
écrit le changement à la place et effectue une sauvegarde si une extension est donnée. (Dans ce cas, .old
)1s;^;to be prepended;
remplace le début de la première ligne par la chaîne de remplacement donnée, en utilisant ;
comme séparateur de commande.printf '%s\n%s\n' "to be prepended" "$(cat text.txt)" >text.txt
C'est une possibilité:
(echo "to be prepended"; cat text.txt) > newfile.txt
vous aurez probablement pas facilement contourner un fichier intermédiaire.
Alternatives (peut être fastidieux avec Shell qui s'échappe):
sed -i '0,/^/s//to be prepended/' text.txt
Je suis surpris que personne n'ait mentionné cela.
cat <(echo "before") text.txt > newfile.txt
ce qui est sans doute plus naturel que la réponse acceptée (imprimer quelque chose et le transférer dans une commande de substitution est contre-intuitif lexicographe).
... et détournant ce que Ryan a dit plus haut, avec sponge
, vous n'avez pas besoin d'un fichier temporaire:
Sudo apt-get install moreutils
<<(echo "to be prepended") < text.txt | sponge text.txt
EDIT: On dirait que cela ne fonctionne pas dans Bourne Shell /bin/sh
En utilisant un here-string - <<<
(encore une fois, vous avez besoin de bash), vous pouvez faire:
<<< "to be prepended" < text.txt | sponge text.txt
Cela fonctionnera pour former la sortie. Le - signifie entrée standard, qui est fournie via le tuyau de l'écho.
echo -e "to be prepended \n another line" | cat - text.txt
Pour réécrire le fichier, un fichier temporaire est requis, car il est impossible de revenir au fichier d'entrée.
echo "to be prepended" | cat - text.txt > text.txt.tmp
mv text.txt.tmp text.txt
Dans certaines circonstances, le texte préfixé peut être disponible uniquement auprès de stdin . Cette combinaison doit alors fonctionner.
echo "to be prepended" | cat - text.txt | tee text.txt
Si vous souhaitez omettre la sortie tee
, ajoutez > /dev/null
.
Probablement rien d’intégré, mais vous pourriez écrire le vôtre assez facilement, comme ceci:
#!/bin/bash
echo -n "$1" > /tmp/tmpfile.$$
cat "$2" >> /tmp/tmpfile.$$
mv /tmp/tmpfile.$$ "$2"
Quelque chose comme ça au moins ...
Solution:
printf '%s\n%s' 'text to prepend' "$(cat file.txt)" > file.txt
Notez que ceci est sans danger sur tous les types d’entrées, car il n’ya pas de développement. Par exemple, si vous souhaitez ajouter !@#$%^&*()ugly text\n\t\n
au début, cela fonctionnera simplement:
printf '%s\n%s' '!@#$%^&*()ugly text\n\t\n' "$(cat file.txt)" > file.txt
La dernière partie à prendre en compte est la suppression des espaces en fin de fichier lors de la substitution de commande "$(cat file.txt)"
. Tous les contournements pour cela sont relativement complexes. Si vous souhaitez conserver les nouvelles lignes à la fin du fichier file.txt, consultez ceci: https://stackoverflow.com/a/22607352/1091436
Une autre façon d'utiliser sed
:
sed -i.old '1 {i to be prepended
}' inFile
Si la ligne à ajouter est multiligne:
sed -i.old '1 {i\
to be prepended\
multiline
}' inFile
Une autre solution assez simple est:
$ echo -e "string\n" $(cat file)
Si vous aimez vi/vim, c'est peut-être plus votre style.
printf '0i\n%s\n.\nwq\n' prepend-text | ed file
# create a file with content..
echo foo > /tmp/foo
# prepend a line containing "jim" to the file
sed -i "1s/^/jim\n/" /tmp/foo
# verify the content of the file has the new line prepened to it
cat /tmp/foo
Je n’aimais pas vraiment les réponses ici, alors j’ai construit ma propre commande: pre
.
Installer avec aller:
go get -u github.com/Flaque/pre
Ajoutez du texte de stdin à un fichier avec:
echo "some at the start" | pre myFile.txt | sponge myFile.txt
La commande n'écrit pas à la place, elle affiche simplement stdout. Vous aurez donc besoin de sponge
à partir de moreutils
à la fin pour enregistrer le fichier.
Je recommanderais de définir une fonction, puis de l'importer et de l'utiliser au besoin.
prepend_to_file() {
file=$1
text=$2
if ! [[ -f $file ]] then
touch $file
fi
echo "$text" | cat - $file > $file.new
mv -f $file.new $file
}
Alors utilisez-le comme suit:
prepend_to_file test.txt "This is first"
prepend_to_file test.txt "This is second"
Le contenu de votre fichier sera alors:
This is second
This is first
Je suis sur le point d'utiliser cette approche pour implémenter un programme de mise à jour du journal des modifications.