web-dev-qa-db-fra.com

Commande Unix pour ajouter du texte à un fichier

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
89
One Two Three
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.
78
printf '%s\n%s\n' "to be prepended" "$(cat text.txt)" >text.txt
135
shime

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
26
0xC0000022L

Processus de substitution

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


Ici chaîne

En utilisant un here-string - <<< (encore une fois, vous avez besoin de bash), vous pouvez faire:

<<< "to be prepended" < text.txt | sponge text.txt
22
Sridhar-Sarnobat

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
15
Adam

Préfère Adam answer

Nous pouvons faciliter l’utilisation de sponge . Maintenant, nous n'avons plus besoin de créer un fichier temporaire et de le renommer en 

echo -e "to be prepended \n another line" | cat - text.txt | sponge text.txt
11
ryan

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.

7
sehari24jam

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 ...

7
Rob I

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

6
VasiliNovikov

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
3
Mert Nuhoglu

Une autre solution assez simple est:

    $ echo -e "string\n" $(cat file)
2
Pat

Si vous aimez vi/vim, c'est peut-être plus votre style.

printf '0i\n%s\n.\nwq\n' prepend-text | ed file
1
Ian Kelling
# 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
0
Jim

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.

0
Evan Conrad

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.

0
AwesomeBobX64