web-dev-qa-db-fra.com

Comment ajouter plusieurs lignes à un fichier

J'écris un script bash pour rechercher un fichier s'il n'existe pas, puis je le crée et je lui ajoute ceci:

Host localhost
    ForwardAgent yes

Donc "line then new line 'tab' then text" Je pense que c'est un format sensible. Je sais que tu peux faire ça:

cat temp.txt >> data.txt

Mais cela semble bizarre depuis ses deux lignes. Existe-t-il un moyen d'ajouter cela dans ce format:

echo "hello" >> greetings.txt
346
TheLegend
# possibility 1:
echo "line 1" >> greetings.txt
echo "line 2" >> greetings.txt

# possibility 2:
echo "line 1
line 2" >> greetings.txt

# possibility 3:
cat <<EOT >> greetings.txt
line 1
line 2
EOT

Si Sudo (autres privilèges utilisateur) est nécessaire pour écrire dans le fichier, utilisez ceci:

# possibility 1:
echo "line 1" | Sudo tee -a greetings.txt > /dev/null

# possibility 3:
Sudo tee -a greetings.txt > /dev/null <<EOT
line 1
line 2
EOT
604
Hauke Laging
printf '%s\n    %s\n' 'Host localhost' 'ForwardAgent yes' >> file.txt

Ou, si c'est un onglet littéral que vous souhaitez (plutôt que les quatre espaces de votre question):

printf '%s\n\t%s\n' 'Host localhost' 'ForwardAgent yes' >> file.txt

Vous pouvez obtenir le même effet avec echo, mais exactement comment varie d'une implémentation à l'autre, tandis que printf est constant.

64
evilsoup
echo -e "Hello \nWorld \n" >> greetings.txt
42
kendotwill

Une autre approche consiste à utiliser tee

tee -a ~/.ssh/config << END
Host localhost
  ForwardAgent yes
END

Quelques lignes de choix de la page de manuel de tee:

L'utilitaire tee copie l'entrée standard sur la sortie standard, faisant une copie dans zéro ou plusieurs fichiers.

-a - Ajoute la sortie aux fichiers plutôt que de les écraser.

22
user206934

SED peut ajouter une ligne à la fin d'un fichier comme ceci:

sed -i '$ a text to be inserted' fileName.file
$ sélectionne la fin du fichier, le a lui dit d'ajouter, et après cela vient le texte qui doit être inséré. Ensuite, bien sûr, le nom du fichier.


Source: http://www.yourownlinux.com/2015/04/sed-command-in-linux-append-and-insert-lines-to-file.html

========== EDIT ============

Cette approche présente-t-elle un avantage supplémentaire par rapport aux autres solutions?
Oui, cette approche a l'avantage supplémentaire d'ajouter à tout fichier renvoyé dans une recherche, comme ceci: find . -name "*.html" -exec sed -i '$ a </html>' {} \;

J'ai utilisé l'exemple ci-dessus pour insérer la balise html de fin qui manquait sur chaque page html dans un certain nombre de répertoires.

===================================

6
OB7DEV

Voici un exemple pour ajouter plusieurs lignes dans un fichier:

{
        echo '  directory "/var/cache/bind";'
        echo '  listen-on { 127.0.0.1; };'
        echo '  listen-on-v6 { none; };'
        echo '  version "";'
        echo '  auth-nxdomain no;'
        echo '  forward only;'  
        echo '  forwarders { 8.8.8.8; 8.8.4.4; };'
        echo '  dnssec-enable no;'
        echo '  dnssec-validation no;'
} >> your_file.txt
3
user2753331

J'ai utilisé sed car il peut être utilisé avec Sudo. Par exemple:

Sudo sed -i '$ a text to be inserted' fileName.file 

l'alternative est très moche comme:

Sudo bash -c "echo a text to be inserted >> fileName.file"  

et encore plus moche une fois terminé avec ssh.

1
Fred Mehrdad

On peut émuler cat >> out.txt avec Perl ou Python pour obtenir le même effet. Perl:

Perl -e 'open(fh,">>","./out.txt");while(<>){printf(fh "%s",$_)};close(fh);'

Et Python:

python -c 'import sys;f=open(sys.argv[1],"a");l=[i for i in sys.stdin];f.write("".join(l))' out.txt 

Notez que pour python vous devrez frapper Ctrl+D deux fois. Voir question connexe sur stackoverflow pour plus d'informations.

1

Une autre doublure est:

echo "Greetings 1" >> greetings.txt && echo "Greetings 2" >> greetings.txt

Je préfère le -e pensée de l'option, car elle donne plus de contrôle:

echo -e "Greeting 1\nGreetings 2\n" >> greetings.txt
1
Erdal G.

En plus de la réponse principale, au cas où le fichier aurait besoin d'autorisations de super-utilisateur, l'ajout de Sudo devant echo ne fonctionnera pas.

En effet, Shell rompt les commandes et bien que echo se soit exécuté en tant que root, mais >> a fonctionné avec des privilèges normaux.

Cela fonctionnera pour le super utilisateur: Sudo su -c "echo 'Line 3' >> greetings.txt"

0
SJ00