web-dev-qa-db-fra.com

Comment insérer un texte au début d'un fichier?

Jusqu'à présent, j'ai pu trouver comment ajouter une ligne au début d'un fichier, mais ce n'est pas exactement ce que je veux. Je vais le montrer sur un exemple

Contenu du fichier

some text at the beginning

Résultat

<added text> some text at the beginning

C'est pareil mais je ne veux pas créer de nouvelle ligne avec elle ...

Je voudrais faire ceci avec sed si possible.

164
user219882

sed peut opérer sur une adresse:

$ sed -i '1s/^/<added text> /' file

Quel est ce 1s magique que vous voyez sur chaque réponse ici? Adressage de ligne! .

Voulez-vous ajouter <added text> sur les 10 premières lignes?

$ sed -i '1,10s/^/<added text> /' file

Ou vous pouvez utiliser Command Grouping :

$ { echo -n '<added text> '; cat file; } >file.new
$ mv file{.new,}
251
kev

Si le fichier ne contient qu'une seule ligne, vous pouvez utiliser:

sed 's/^/insert this /' oldfile > newfile

Si c'est plus d'une ligne. un des:

sed '1s/^/insert this /' oldfile > newfile
sed '1,1s/^/insert this /' oldfile > newfile

J'ai inclus ce dernier afin que vous sachiez comment créer des plages de lignes. Les deux remplacent le marqueur de la ligne de départ sur les lignes concernées par le texte que vous souhaitez insérer. Vous pouvez également (en supposant que votre sed soit suffisamment moderne) utiliser:

sed -i 'whatever command you choose' filename

faire du montage sur place.

26
paxdiablo

Si vous souhaitez ajouter une ligne au début d'un fichier, vous devez ajouter \n à la fin de la chaîne dans la meilleure solution ci-dessus. 

La meilleure solution consiste à ajouter la chaîne, mais avec la chaîne, elle n’ajoutera pas de ligne à la fin du fichier.

sed -i '1s/^/your text\n/' file
24
Ali Reza Ebadat

Vous pouvez utiliser cat -

printf '%s' "some text at the beginning" | cat - filename
9
Lex

Pour insérer juste une nouvelle ligne:

sed '1i\\'
8
user4427511

Notez que sur OS X, sed -i <pattern> file, échoue. Cependant, si vous fournissez une extension de sauvegarde, sed -i old <pattern> file, alors file est modifié à la place alors que file.old est créé. Vous pouvez ensuite supprimer file.old dans votre script.

5
Curt Clifton

PROBLEM: marque un fichier, en haut du fichier, avec le nom de base du répertoire parent.

C'est-à-dire pour

/mnt/Vancouver/Programming/file1

marquez le haut de file1 avec Programming.

SOLUTION 1 - fichiers non vides:

bn=${PWD##*/}    ## bn: basename

sed -i '1s/^/'"$bn"'\n/' <file>

1s place le texte à la ligne 1 du fichier.

SOLUTION 2 - fichiers vides ou non vides:

La commande sed ci-dessus échoue avec les fichiers vides. Voici une solution basée sur https://superuser.com/questions/246837/how-do-i-add-text-to-the-beginning-of-a-file-in-bash/246841#246841

printf "${PWD##*/}\n" | cat - <file> > temp && mv -f temp <file>

Notez que le - dans la commande cat est requis (lit l'entrée standard: voir man cat pour plus d'informations). Ici, je pense qu’il est nécessaire de prendre le résultat de la déclaration printf (à destination de STDIN), et de cat ça et le fichier à temp ... Voir aussi l’explication au bas de http://www.linfo.org /cat.html .

J'ai également ajouté -f à la commande mv, pour éviter de demander des confirmations lors du remplacement de fichiers.

Pour recurse sur un répertoire:

for file in *; do printf "${PWD##*/}\n" | cat - $file > temp && mv -f temp $file; done

Notez également que cela va briser les chemins avec des espaces; il existe des solutions ailleurs (par exemple, la suppression de fichiers ou les solutions de type find . -type f ...) pour celles-ci.

ADDENDUM: Re: mon dernier commentaire, ce script vous permettra de recurse sur des répertoires avec des espaces dans les chemins:

#!/bin/bash

## https://stackoverflow.com/questions/4638874/how-to-loop-through-a-directory-recursively-to-delete-files-with-certain-extensi

## To allow spaces in filenames,
##   at the top of the script include: IFS=$'\n'; set -f
##   at the end of the script include: unset IFS; set +f

IFS=$'\n'; set -f

# ----------------------------------------------------------------------------
# SET PATHS:

IN="/mnt/Vancouver/Programming/data/claws-test/corpus test/"

# https://superuser.com/questions/716001/how-can-i-get-files-with-numeric-names-using-ls-command

# FILES=$(find $IN -type f -regex ".*/[0-9]*")        ## recursive; numeric filenames only
FILES=$(find $IN -type f -regex ".*/[0-9 ]*")         ## recursive; numeric filenames only (may include spaces)

# echo '$FILES:'                                      ## single-quoted, (literally) prints: $FILES:
# echo "$FILES"                                       ## double-quoted, prints path/, filename (one per line)

# ----------------------------------------------------------------------------
# MAIN LOOP:

for f in $FILES
do

  # Tag top of file with basename of current dir:
  printf "[top] Tag: ${PWD##*/}\n\n" | cat - $f > temp && mv -f temp $f

  # Tag bottom of file with basename of current dir:
  printf "\n[bottom] Tag: ${PWD##*/}\n" >> $f
done

unset IFS; set +f
3
Victoria Stuart

Salut avec retour chariot:

sed -i '1s/^/your text\n/' file
2
xck

Il y a un moyen très simple: 

echo "your header" > headerFile.txt
cat yourFile >> headerFile.txt
2

Juste pour le plaisir, voici une solution utilisant ed qui n'a pas le problème de ne pas travailler sur un fichier vide. Vous pouvez l'insérer dans un script Shell comme n'importe quelle autre réponse à cette question. 

ed Test <<EOF
a

.
0i
<added text>
.
1,+1 j
$ g/^$/d
wq
EOF

Le script ci-dessus ajoute le texte à insérer à la première ligne, puis joint les première et deuxième lignes. Pour éviter que ed ne quitte par erreur avec une jointure non valide, il crée d'abord une ligne vide à la fin du fichier et le supprime ultérieurement s'il existe toujours.

Limitations: Ce script ne fonctionne pas si <added text> est exactement égal à une période.

1
merlin2011
echo -n "text to insert " ;tac filename.txt| tac > newfilename.txt

La première tac dirige le fichier en arrière (dernière ligne en premier) de sorte que le "texte à insérer" apparaisse en dernier. La 2nd tac l'habille à nouveau pour que la ligne insérée se trouve au début et que le fichier d'origine soit dans son ordre d'origine.

1
paulp

mes deux centimes:

sed  -i '1i /path/of/file.sh' filename

Cela fonctionnera même si la chaîne contenant la barre oblique précédente "/"

1
vardhan

Pour ajouter une ligne en haut du fichier:

sed -i '1iText to add\'
1
solidsnack

Utiliser le sous-shell:

echo "$(echo -n 'hello'; cat filename)" > filename
0
Nick Roz