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.
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,}
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.
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
Vous pouvez utiliser cat -
printf '%s' "some text at the beginning" | cat - filename
Pour insérer juste une nouvelle ligne:
sed '1i\\'
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.
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
Salut avec retour chariot:
sed -i '1s/^/your text\n/' file
Il y a un moyen très simple:
echo "your header" > headerFile.txt
cat yourFile >> headerFile.txt
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.
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.
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 "/"
Pour ajouter une ligne en haut du fichier:
sed -i '1iText to add\'
Utiliser le sous-shell:
echo "$(echo -n 'hello'; cat filename)" > filename