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

77

La commande 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?

don_crissti
la source
3
{ cat file; echo 'END OF FILE'; } > newFile , cela fonctionne aussi grâce à sh. *. (pas sed mais fonctionne et simple)
4
un simple echo "Cool Text" >> filedevrait aussi faire l'affaire.
Danpe

Réponses:

95

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

Comment ça fonctionne

$correspond à la dernière ligne (c'est une sedadresse normale ; 4aTEXTTOENDinsérerait après la quatrième ligne), acorrespond à la commande append et à TEXTTOENDce qu'il faut ajouter.

vendeur
la source
Escape $ as $$ dans un Makefile.
Stevesliva
Pour OS X sed -e '$a\NEWLINE\\'. Remplacez NEWLINE par une nouvelle ligne réelle.
Jorge Bucaran
15
sed -i -e "\ $ aTEXTTOEND" <nom_fichier> serait la commande complète.
Lasse Meyer
2
ne fonctionne pas sur macos. Même pas Jorge Bucaran commentaire: sed: 1: "$ a \ NEWLINE \\": caractères supplémentaires après \ à la fin d'une commande
Emanuele Paolini
1
Dans debian 9, il ajoute une nouvelle ligne au lieu d’ajouter à la fin de la dernière ligne.
Luciano Andress Martini
31

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

echo "<?php" >> file
innaM
la source
2
C'est assez vrai, mais vous pouvez deviner que le cas d'utilisation de l'OP est de mettre " <php " et " >" entre crochets le fichier , et de citer le contenu sélectionné en une fois, donc il veut probablement vraiment un sedfragment.
dmckee
2
Aussi, si vous faites cela et que vous ne voulez pas de nouvelle ligne, utilisez echo -n
Vinko Vrsalovic le
2
Je n'aime pas deviner. Chaque fois que j'essaye, je me trompe.
4
Une autre raison pour laquelle la réponse acceptée est plus utile est dans le cas de l'ajout de préfixe avec sudo, ce qui provoque l'échec de cette variation puisqu'il echos'agit d'une commande intégrée dans le shell plutôt que d'un fichier exécutable trouvé dans$PATH
Tony Cesaro -
@TonyCesaro: echoest un fichier intégré, mais aussi un fichier exécutable se trouvant dans$PATH
Zan Lynx
24

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

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

devrait faire l'affaire

Vinko Vrsalovic
la source
1
Cela fonctionne bien dans les cas où une manipulation arbitraire de la dernière ligne d'entrée est souhaitée. Merci!
Jay Taylor
Une explication décomposée de la commande serait grandement appréciée
GGhe
3

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
utilisateur2802945
la source
2

De manière simple, écrivez et modifiez le contenu d’une ligne spécifique dans un fichier. Si vous souhaitez insérer quelque chose à un numéro de ligne spécifique, vous pouvez utiliser la commande ci-dessous:

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

2i- numéro de ligne 2 et i signifie insertion. Si vous devez insérer à la dernière ligne, utilisez $plutôt 2. J'ai commencé - texte à insérer et sheikh.logest le nom du fichier.

Nous pouvons également faire les changements dans la ligne en utilisant la commande ci-dessous

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

iest changé en we.

cheikh Mohammed Abdulla
la source
-1

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 aussi savoir comment faire l'autre.

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

Explication

Cette calsortie est dirigée vers gnu sed(appelée gsedsur macOS installé via brew.sh ) avec RegEx ( -E) étendu et 6 "scripts" appliqués ( -e) et les sauts de ligne avec échappée \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 que l'on attend du résultat. Les scripts 3 et 4 font des substitutions (la dernière ne s’appliquant qu'à "ligne <dernier>"). Le résultat est la conversion de la sortie de la commande en JSON valide.

sortie

{
  "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        ",
    "                      "
  ]
}
Bruno Bronosky
la source
Bien que je n’aie pas voté sur votre question, notez que nous avons déjà plusieurs réponses, y compris une réponse acceptée, qui démontrent le résultat souhaité.
Jeff Schaller
@JeffSchaller La communauté Stack Exchange n'est pas un forum. Son objectif ne se limite pas à aider le PO à se débloquer. L’objectif est de doter la base de connaissances mondiale de nombreuses options sur lesquelles les chercheurs peuvent trébucher lorsqu’ils cherchent des réponses. La raison pour laquelle j'ai intitulé ma réponse est d'aider les utilisateurs à reconnaître l'utilité de cette réponse avant même de cliquer sur le résultat de Google.
Bruno Bronosky