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 texteHEAD
dans la première ligne au début de la ligne -
$s/$/TAIL/
– ajouteTAIL
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 (*
) avecfoo
extension, utilisez**/*.foo
pour 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
-i
au lieu de cette substitution de fichier ne fonctionne pas , elle s’imprime simplement sur stdout.