9
votes

Insertion de texte à partir d'un fichier au début d'un autre fichier - bash

J'essaie d'insérer des informations de copie-droite au début de certains fichiers source. Je sais que, à l'aide de SRD de la manière suivante: xxx

insérerait le texte "certaines informations protégées par le droit d'auteur" au début de l'échantillon.txt.
J'ai besoin d'insérer du texte à partir d'un fichier au début de l'échantillon.txt. Y a-t-il un moyen dans la commande SED que je pourrais utiliser une commande chat pour le but ci-dessus, dites quelque chose comme ce qui suit?: xxx

J'ai googlé Pour ce qui précède et n'a pas trouvé exactement ce que je cherchais. Toute aide sur ceci est la plus bienvenue.

Merci.


0 commentaires

6 Réponses :


5
votes
cat header.txt sample.txt > temp.txt
mv temp.txt sample.txt

3 commentaires

qui mettra en-tête sous un échantillon


Cela ajoutera Sample.Text to Header.txt. La commande est correcte. Après votre commentaire, j'ai encore essayé. Ça marche.


Vous pouvez le faire sur une ligne ... "Cat Header.txt exemplant.txt> temp.txt && mv temp.txt exemplant.txt" ... assez compréhensible une fois que vous l'avez utilisé une fois.



1
votes

Si vous voulez vraiment le faire en utilisant SED CODE>:

INFO=$(cat header.txt)  # read the contents of file headers.txt into var INFO
sed -i "1i$INFO" sample.txt # insert $INFO, use -i to change the file inplace


2 commentaires

Je pense que cette méthode ne fonctionnerait pas si votre en-tête contient des chaînes que SED interprète comme une commande.


Tangens a raison, cela ne fonctionne pas. Le header.txt contient des informations sous la forme de commentaires de style C (/ * et * /) que sed interprète comme une commande.



0
votes

Pourquoi ne pas faire cela l'inverse, par exemple Ajoute vos fichiers source à votre fichier de copyright?

La commande 'Cat' est effectivement courte pour "Concaténate", vous pouvez simplement dire P>

for f in *.c
do
    cp $f /tmp
    cat copyright.txt /tmp/$f >$f
done


2 commentaires

Vous avez un problème de nettoyage majeur dans / TMP - et cela suppose que vous ne travaillez pas dans / TMP en premier lieu!


Pas vraiment, c'est quoi / TMP est pour. Si vous êtes heureux, vous venez de les rm, si vous n'êtes pas, vous avez garanti que vous pouvez annuler le changement.



8
votes

Utiliser ED Editeur d'éditeur ED:

vi - +'0r header.txt|wq' sample.txt


0 commentaires

10
votes

Si vous avez GNU sed : xxx

échantillon.txt doit être contenant au moins deux lignes.

Cette méthode fonctionne même si Le fichier d'en-tête contient des caractères spéciaux à sed .

explication:

  • -i - Modifiez le fichier en place
  • -e - casser le script en sections - ceci est nécessaire dans ce cas pour délimiter la fin du nom de fichier d'en-tête (il pourrait également être délimité par une nouvelle ligne)
  • 1 {h; - sur la première ligne du fichier (exemple.txt) Enregistrez-le pour tenir l'espace
  • rheader.txt - lire dans le fichier d'en-tête (Header.txt)
  • d} - Supprimer la première ligne d'origine du fichier à partir de l'espace de motif et le traitement final de la ligne 1 - Supprimer ici empêche une ligne vierge supplémentaire d'être insérée au début du fichier
  • Le contenu du fichier d'en-tête est maintenant émis
  • 2 {x; - lorsque la ligne 2 du fichier (Sample.txt) est lue, échangez-la dans l'espace enfoncé et envoie l'espace de maintien (contenant la ligne d'origine 1) dans l'espace de motif
  • g} - Ajoutez de l'espace de maintien sur la fin de l'espace de motif (qui contient maintenant des lignes d'origine 1 et 2) et un traitement complet de la ligne 2
  • Les lignes 1 et 2 sont maintenant émises, le traitement continue alors du reste du fichier qui consiste à lire et à émettre chaque ligne.

    EDIT: J'ai supprimé une commande superflue de la version que j'ai initialement affichée.


2 commentaires

Comment allez-vous récursivement [avec condition] appliquer ceci à tous les fichiers d'un dossier? E.g: pour tous les sous-dossiers / fichiers dans. : Si le fichier est * .C, alors sed_cmd ??


@bny: Une manière (pour Bash 4): Shopt -s Globstar; pour le fichier dans ./**/*.c; faire [[-F $ Fichier]] && Sed_cmd; fait . Vous utiliseriez "$ fichier" comme argument de nom de fichier à sed . Vous pouvez utiliser trouver` et xargs au lieu de la boucle pour si, par exemple, vous utilisez une version précédente de bash.



11
votes

Désolé d'utiliser toute une réponse - juste pour la mise en forme :) Fondamentalement, la même réponse de @Tangens, mais sans le fichier temporaire: xxx

notez les devis (< Code> ") Pour préserver les fins de la ligne et le fait que la concaténation CAT est exécutée dans un sous-processus - il ne devrait donc pas y avoir la possibilité d'écraser un fichier (le exemplant.txt ) qui est ouvert pour la lecture.

acclamations!


0 commentaires