Ajouter ## à chaque ligne d'un fichier texte

30

Je veux ajouter des hachages à toutes les lignes d'un fichier texte normal. Je suis bien avec l'utilisation du terminal et de l'interface graphique — je dois juste le faire.

Oxwivi
la source

Réponses:

50

Vous pouvez utiliser sedpour cela:

sed -i.bak 's/^/##/' file

Cela remplace le début de la ligne ( ^) par ##.

Avec le -i.bakcommutateur, sedmodifie le fichier sur place, mais crée une copie de sauvegarde avec l'extension .bak.

Jukka Matilainen
la source
1
+1 C'est la première fois que je rencontre cette méthode de sauvegarde. J'ai toujours fait une ligne directement remplacerai: sed 's/^/##/' -i file. Dans ce cas, cela serait préférable car il ne peut pas se tromper. Dans d'autres cas, cette commande peut être combinée avec diff -u file.bak filepour voir les différences (si nécessaire, dirigez-la less). S'il est confirmé que cela fonctionne, la sauvegarde peut être supprimée. Sinon, il pourrait être restauré avec un simple mv file.bak file.
Lekensteyn
1
Élégant. Je pensais à quelque chose comme ça sed 's/^\(.*\)$/##\1/', mais c'est beaucoup mieux.
organiser le
Nice one .. Je pensais suggérer à Vim de faire ça ...
Sathish
Cela m'a aidé à convertir un fichier de liste de blocage :) Merci 1+
Neil
8

Voici une solution à ce problème en utilisant perl

perl -e 'while (<>) {print "##$_"}' < infile > outfile
beav_35
la source
2
Le -pcommutateur est également utile: perl -pe 's/^/##/' infile > outfile. (Il y a aussi le -i[extension]commutateur pour remplacer le fichier cible sur place.) Perldoc.perl.org/perlrun.html#%2a-p%2a
Jukka Matilainen
4

Voici un bashmoyen:

while read -r; do printf '##%s\n' "$REPLY"; done < infile > outfile

( Dans le bashshell , l'exécution read -rsans autre argument fonctionne comme IFS= read -r REPLY.)

Ceci est stylistiquement inspiré par la solution perl de beav_35 , qui, je l'avoue, fonctionne probablement beaucoup plus rapidement pour les fichiers volumineux, car perlon peut s'attendre à ce qu'elle soit plus efficace qu'un shell en matière de traitement de texte.

Eliah Kagan
la source
3

sed -in'est pas standard POSIX, donc si vous êtes un puriste, vous voudrez utiliser ed:

printf ",s/^/##/\nw\nq" | ed -s file.txt
fkraiem
la source
3

Voici un perlmoyen plus simple que celui présenté ailleurs:

perl -pi -e 'print "##"' YOURFILEHERE

Cette (ab) utilise le fait qui perl -pimprime la ligne après avoir exécuté la commande donnée dans -e.

abligh
la source
0

Vous pouvez utiliser Vim en mode Ex:

ex -sc '%s/^/##/|x' file
  1. % sélectionner toutes les lignes

  2. s remplacer

  3. x sauver et fermer

Steven Penny
la source
0

Peut être fait avec la fonction de mappage de python et la redirection de stdin:

$ cat input.txt                                                                                                          
lorem ipsum
quick brown fox
hello world
$ python -c 'import sys;print "".join(map(lambda x: "##"+x,sys.stdin.readlines()))'  < input.txt                         
##lorem ipsum
##quick brown fox
##hello world

Enregistrez la sortie dans un nouveau fichier et utilisez-la à la place de l'original

Sergiy Kolodyazhnyy
la source