Comment ajouter du texte au début et à la fin de plusieurs fichiers texte dans Bash?

Jai un répertoire plein de fichiers texte. Mon objectif est dajouter du texte au début et à la fin de chacun deux. Le texte qui va au début et à la fin est le même pour chaque fichier.

Basé sur le code que jai obtenu sur le Web, voici le code à ajouter au début du fichier:

echo -e "var language = {\n$(cat $BASEDIR/Translations/Javascript/*.txt)" > $BASEDIR/Translations/Javascript/*.txt 

Ceci est le code à ajouter à la fin du fichier. Le but est dajouter le texte }; à la fin de chaque fichier:

echo "};" >> $BASEDIR/Translations/Javascript/*.txt 

Les exemples dont je me suis tiré étaient pour agir sur des dossiers individuels. Je pensais que jessaierais dagir sur plusieurs fichiers en utilisant le caractère générique, *.txt.

Je pourrais aussi faire dautres erreurs. Dans tous les cas, comment puis-je ajouter du texte au début et à la fin de plusieurs fichiers?

Réponse

Pour ajouter du texte à un fichier, vous pouvez utiliser (avec le Implémentation GNU de sed):

sed -i "1i some string" file 

Lajout de texte est aussi simple que

echo "Some other string" >> file 

La dernière chose à faire est de mettre cela dans une boucle qui itère sur tous les fichiers que vous comptez éditer:

for file in *.txt; do sed -i "1i Some string" "$file" && echo "Some other string" >> "$file" done 

Réponse

Vous pouvez utiliser GNU sed

Comme déjà illustré, vous pouvez insérer des lignes de texte juste avant et après la correspondance lignes dun fichier avec sed, en utilisant respectivement les commandes i et a. « Il a été montré que vous pouvez le faire avec une seule ligne et pour plusieurs fichiers à la fois.

Ce qui suit insérera une ligne avant le premier 1i et après la dernière ligne $a. Les insertions seront exécutées pour tous les fichiers correspondant au glob *.txt.

sed -i -e "1ivar language = {" -e "$a};" -- *.txt 

Les deux i et a ne fonctionnent pas seulement avec les numéros de ligne, mais également sur chaque ligne qui correspond à un modèle donné. Cela insérerait un commentaire chaque fois quune ligne contient var y = 2;:

sed -i -- "/var y = 2;/i//initialize variable y" *.js 

Réponse

Commande entièrement compatible POSIX, utilisant ex :

for f in *.txt; do printf "%s\n" 0a "var language = {" . "$a" "};" . x | ex "$f"; done 

Si vous exécutez la partie printf de la commande seule, vous verrez les commandes dédition exactes quelle passe à ex:

0a var language = { . $a }; . x 

0a signifie « Ajouter texte après la ligne 0 « (en dautres termes, avant la première ligne). La ligne suivante est le texte littéral à « ajouter » après la ligne 0. Le point (.) sur une ligne termine à lui seul le texte à ajouter.

$a signifie ajouter du texte après la dernière ligne du fichier.

x signifie enregistrer les modifications et quitter .

Réponse

Voici « une façon de le faire en Perl:

for f in ./*txt; do perl -lpe "BEGIN{print "First string"}END{print "Last string"}" "$f" > foo && mv foo "$f"; done 

Commentaires

  • @St é phaneChazelas ajout de -i au lieu de cette substitution de fichier ne fonctionne pas , elle s’imprime simplement sur stdout.
  • @OlehPrypin, en effet votre droit. Commentaire supprimé.

Réponse

A également le droit dêtre (avec des résultats dans des fichiers .out):

find . -name "*.txt" -exec sh -c "(echo HEAD;cat {};echo FOOT) > {}.out" \; 

Une autre variante plus élaborée – les fichiers source sont remplacés par le résultat:

find . -name "*.txt" -exec sh -c "(echo HEAD;cat {};echo FOOT) > {}.tmp && mv {}.tmp {}" \; -print 

Réponse

Essayez dutiliser ex:

ex -s +"bufdo!1s/^/HEAD/|$s/$/TAIL/" -cxa *.foo 

où les commandes sont:

  • bufdo! exécute les commandes ci-dessous pour chaque tampon / fichier ouvert (remarque: ce nest pas POSIX )
  • 1s/^/HEAD/ – insère le texte HEAD dans la première ligne au début de la ligne
  • $s/$/TAIL/ – ajoute TAIL le texte sur la dernière ligne à la fin de la ligne

et les arguments sont:

  • -s – mode silencieux / rapide
  • -cxa – enregistrer tous les tampons / fichiers ouverts et quitter
  • *.foo – tous les fichiers du répertoire courant (*) avec foo extension, utilisez **/*.foo pour la récursivité (après lactivation de globstar: shopt -s globstar)

Commentaires

Réponse

Avec gnu awk, en utilisant le inplace extension et BEGINFILE / ENDFILE:

gawk -i inplace "BEGINFILE{print "INSERT"};ENDFILE{print "APPEND"};1" ./*.txt 

Réponse

Perl one-liner à la rescousse:

perl -i -pe"$_="FIRST LINE\n$_"if$.<2;$.=0,$_.="LAST LINE\n"if eof" *.txt 

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *