web-dev-qa-db-fra.com

SED: insérer du texte après la dernière ligne?

Cette commande sed insère une balise au début d'un fichier:

sed -i "1s/^/<?php /" file

Comment puis-je insérer quelque chose à la fin de chaque fichier avec sed?

82
user2362

sed -e "\$aTEXTTOEND" est le moyen le plus simple.

Comment ça fonctionne

$ correspond à la dernière ligne (c'est une adresse sed normale; 4aTEXTTOEND serait inséré après la quatrième ligne), a est la commande append et TEXTTOEND est ce qu'il faut ajouter.

101
bseller

Pas besoin d'utiliser sed dans ce cas. Que diriez-vous

echo "<?php" >> file
34
innaM

En supposant que vous vouliez mettre la balise php de fin dans les fichiers,

sed -i '$s/$/\n?>/' file

devrait faire l'affaire

25
Vinko Vrsalovic

Voir votre message d'origine pour la commande tout en un sed.

find . -type f -exec sed -i -e "1s/^/<?php /" -e "\$s/\$/ ?>/" {} \;
5
Tim Desjardins

Utilisez la commande sed 'append (a)'. Par exemple, pour ajouter deux lignes à la fin du fichier:

sed -i -e '$a\
foo1 bar1\
foo2 bar2' file
5
user2802945

D'une manière simple pour écrire et apporter les modifications dans le contenu à une ligne spécifique dans un fichier. Si vous souhaitez insérer quelque chose à un numéro de ligne spécifique, la commande ci-dessous peut être utilisée:

sed -i '2i i have started' sheikh.log

2i - ligne numéro 2 et i signifie insertion. Si vous devez insérer à la dernière ligne, utilisez $ au lieu de 2. j'ai commencé - texte à insérer et sheikh.log est le nom du fichier.

Nous pouvons également effectuer les modifications dans la ligne en utilisant la commande ci-dessous

sed -i '2c we have started' sheikh.log

i est remplacé par we.

2

Sans retour de ligne/chariot, ajouter du texte hello à la fin de la ligne et éditer le fichier en place sans sortie vers le terminal

sed -i '$s/$/hello/' file
0
FastGTR

L'équivalent de votre sed -i '1s/^/<start</' file serait:

sed -i '$s/$/>end>/' file

Cela ajoutera le texte >end> jusqu'à la dernière ligne (sans retour à la ligne) du fichier. Bien sûr, dans ce cas (comme dans votre exemple également) il faut que le fichier contienne au moins une ligne (non vide).

L'utilisation de guillemets doubles (comme dans la réponse sélectionnée) n'est pas une bonne idée car alors le Shell essaiera de traiter chaque $ dans la chaîne. La commande se convertira en:

sed -i "\$s/\$/>end>/" file

L'utilisation de a (ajout, fin) ou i (insertion, début) insérera également une nouvelle ligne, exigera différents appels en BSD et GNU et aura toujours besoin d'un fichier non vide.

Pour GNU:

$ sed '1i<start<' file
$ sed '$a>end>' file

Pour BSD:

$ sed '1i\
<start<' file
$ sed '$a\
>end>' file

Ou, dans des shells qui le permettent (chaîne C):

$ sed $'1i\\\n<start<' file
$ sed $'$a\\\n>end>' file

Bien sûr, rien de plus simple que:

echo '>end>' >> file

qui fonctionne également avec des fichiers vides.

0
Isaac

Premier et dernier

Je suppose que quiconque a cherché comment insérer/ajouter du texte au début/à la fin d'un fichier doit probablement également savoir comment faire l'autre.

cal |                            \
  gsed -E                        \
       -e     '1i\{'             \
       -e     '1i\  "lines": ['  \
       -e 's/(.*)/    "\1",/'    \
       -e '$s/,$//'              \
       -e     '$a\  ]'           \
       -e     '$a\}'

Explication

Il s'agit de cal sortie dirigée vers gnu -sed (appelée gsed sur macOS installé via brew.sh ) avec RegEx étendu (-E) et 6 "scripts" appliqués (-e) et les sauts de ligne se sont échappés avec \ pour plus de lisibilité. Les scripts 1 et 2 utilisent 1i\ à "à la ligne 1, insérer". Les scripts 5 et 6 utilisent $a\ à "à la ligne <dernière>, ajoutez". J'ai aligné verticalement les sorties de texte pour que le code représente ce qui est attendu dans le résultat. Les scripts 3 et 4 font des substitutions (ce dernier ne s'appliquant qu'à la "ligne <dernière>"). Le résultat convertit la sortie de la commande en JSON valide.

production

{
  "lines": [
    "    October 2019      ",
    "Su Mo Tu We Th Fr Sa  ",
    "       1  2  3  4  5  ",
    " 6  7  8  9 10 11 12  ",
    "13 14 15 16 17 18 19  ",
    "20 21 22 23 24 25 26  ",
    "27 28 29 30 31        ",
    "                      "
  ]
}
0
Bruno Bronosky