Comment ajouter plusieurs lignes à un fichier

301

J'écris un script bash pour rechercher un fichier s'il n'existe pas, puis créez-le et ajoutez-y 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. Y at-il un moyen d'ajouter cela dans ce format:

echo "hello" >> greetings.txt
La légende
la source

Réponses:

527
# 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
Hauke ​​Laging
la source
2
@TheLegend Cela s'appelle un "ici document". Consultez ce paragraphe dans la page de manuel.
Hauke ​​Laging
1
Une autre possibilité est ( echo "line 1" ; echo "line 2" ) >>greetings.txt.
ott--
2
@ ott-- Vous n'avez pas besoin d' un vrai sous - shell (c. -à- peut sauver un nouveau processus), cela suffit:{ echo "line 1" ; echo "line 2"; } >>greetings.txt
Hauke Laging
2
Quelle est la différence entre EOT et EOL?
Cikatomo
15
@cikatomo Dans cat <<EOTle EOTest juste une chaîne aléatoire. Pourrait être cat <<FOOaussi.
Hauke ​​Laging
60
printf '%s\n    %s\n' 'Host localhost' 'ForwardAgent yes' >> file.txt

Ou, si vous voulez un onglet littéral (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 sa variation varie d’une mise en œuvre à l’autre, alors qu’elle printfest constante.

maux de tête
la source
33
echo -e "Hello \nWorld \n" >> greetings.txt
Kendotwill
la source
16

Une autre approche consiste à utiliser tee

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

Quelques lignes de choix de teela page de manuel de:

L'utilitaire tee copie l'entrée standard vers la sortie standard, en effectuant une copie dans zéro fichier ou plus.

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


la source
6

SED peut ajouter une ligne à la fin d'un fichier de la manière suivante:

sed -i '$ a text to be inserted' fileName.file
$sélectionne la fin du fichier, le lui adit d'ajouter, puis le texte à insérer. 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 à d'autres solutions?
Oui, cette approche présente l’avantage supplémentaire d’ajouter à tout retour de fichier dans une recherche, par exemple: 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.

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

OB7DEV
la source
1
Si vous montriez la syntaxe pour ajouter plusieurs lignes à un fichier, il s'agirait alors d'une réponse à la question (bien que peu utile). Toutes les autres réponses écrivent simplement le nouveau texte. Cette réponse lit le fichier entier et le réécrit, ainsi que le texte ajouté. Cette approche présente-t-elle un avantage par rapport aux autres?
G-Man
Cela ne fonctionne qu'avec GNU sed. BSD sedrenfloue avec l'erreur: command a expects \ followed by text. Donc, ne l'utilisez pas pour une solution scriptée; c'est susceptible de se briser. (Ou faites-le correctement, car la syntaxe requise par BSD est compatible POSIX et fonctionnera également sous GNU sed.
Wildcard
Les autres réponses peuvent être utilisées avec findcomme suit: find . -name "*.txt" -exec sh -c 'printf "%s\n\t%s\n" "Host localhost" "ForwardAgent yes" >> "$1"' sh {} ";".
G-Man
1
C'est une très bonne solution, car elle ne fait pas de redirection de flux ( >, >>) et ne souffre donc pas de problèmes tels que l'exécution sudo echo 'something' > /file. Pour moi , il permet parfaitement d'ajouter une ligne à un fichier dans un contenant LXD comme ça: lxc exec c sed -- '$ a newline' /myfile.
Draco Ater
Le echo "a new line" >> foo.filene créera pas de nouvelle ligne lorsque le fichier ne sera pas en fin de nouvelle ligne, mais le sed -i '$ a a new line' foo.filefera. Il sedest donc préférable que vous ajoutiez toujours une nouvelle ligne au fichier.
Zhouji
1

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 laide comme:

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

et encore plus laid quand on a fini avec ssh.

Fred Mehrdad
la source
1
Pourquoi cette réponse a-t-elle été votée? Cela ressemble à la solution dont j'ai besoin. Y at-il un problème avec ça? Sinon, je vais l'utiliser et le voter.
MountainX
Ne prenez-vous sed -ipas une extension comme argument? Votre exemple peut avoir des paramètres incorrects.
protometa
1

Une autre ligne est:

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

Je préférerais l' -eoption pensée, car cela donne plus de contrôle:

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

On peut émuler cat >> out.txtavec 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 appuyer sur Ctrl+ Ddeux fois. Voir la question connexe sur stackoverflow pour plus d'informations.

Sergiy Kolodyazhnyy
la source
1

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
utilisateur2753331
la source
0

En plus de la réponse principale, si le fichier nécessite des autorisations super-utilisateur, il ne suffit pas de l'ajouter sudodevant echo.

En effet, shell interrompt les commandes et echos’exécute en tant que root, mais >>avec des privilèges normaux.

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

SJ00
la source
Vous n'avez pas besoin de l' suici ( sudo suc'est pas bon). Mais vous avez raison de dire que vous avez besoin de quelque chose pour gérer la redirection du shell; peut - être sudo sh -c "echo stuff >> file.txt". Pas d'économie nette mais une meilleure pratique.
Roaima