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
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 texteHEADdans la première ligne au début de la ligne -
$s/$/TAIL/– ajouteTAILle 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 (*) avecfooextension, utilisez**/*.foopour la récursivité (après lactivation de globstar:shopt -s globstar)
Commentaires
- note bufdo nest pas POSIX pubs.opengroup.org/onlinepubs/9699919799/utilities/ex.html
- @StevenPenny a raison. Jutilise les fonctionnalités spécifiées par POSIX uniquement, personnellement, pour les modifications scriptées.
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
-iau lieu de cette substitution de fichier ne fonctionne pas , elle s’imprime simplement sur stdout.