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?


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.


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

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


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

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.


-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        ",
    "                      "
  ]
}

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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.