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
# 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
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.
echo -e "Hello \nWorld \n" >> greetings.txt
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.
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.
===================================
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
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.
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.
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
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"