Je veux ajouter du texte au fichier comme echo "abc" >>file.txt
.
Mais cet ajout abc
après une nouvelle ligne
Comment puis-je ajouter abc
à la fin du fichier avec écho sans nouvelle ligne?
Je veux ajouter du texte au fichier comme echo "abc" >>file.txt
.
Mais cet ajout abc
après une nouvelle ligne
Comment puis-je ajouter abc
à la fin du fichier avec écho sans nouvelle ligne?
abc
sans une nouvelle ligne finale, qui (après avoir lu attentivement votre question) ne semble pas être ce que vous voulez.Réponses:
echo "abc" >>file.txt
met une nouvelle ligne aprèsabc
, pas avant. Si vous vous retrouvez avecabc
sa propre ligne, cela signifie que la nouvelle ligne avantabc
était déjà présente dansfile.txt
.Notez qu'il est parfaitement normal qu'un fichier texte se termine par une nouvelle ligne. Sous Unix, une ligne se compose d'une séquence de caractères autres que null⁰ ou newline suivie d'une nouvelle ligne. 1 Par conséquent, tout fichier texte non vide se termine par un caractère de nouvelle ligne.
Si vous souhaitez ajouter du texte à la dernière ligne d'un fichier, vous ne pouvez pas le faire avec
>>
, car cela s'ajoute toujours au fichier, donc il écrit toujours après la dernière nouvelle ligne. Au lieu de cela, vous avez besoin d'un outil capable de modifier un fichier existant. Par exemple, vous pouvez utiliser sed :Dans la commande sed, le premier
$
signifie «s/REGEX/REPLACEMENT/
exécuter la commande suivante uniquement sur la dernière ligne», la commande remplace REGEX par REPLACEMENT et l'expression régulière$
correspond à la fin de la ligne.La commande sed de Linux a une fonction intégrée pour automatiser cette séquence de création de nouveau fichier et de remplacement, vous pouvez donc la raccourcir en
⁰ C'est un octet nul, que ASCII appelle NUL et Unicode appelle U + 0000. Les programmes de traitement de texte peuvent ou non gérer ce caractère.
1 Voir les définitions de fichier texte , ligne et caractère de nouvelle ligne dans la section "Définitions" du chapitre Définitions de base de IEEE 1003.1-2008: 2016.
la source
0x41
(ASCII'A'
), ce n'est techniquement plus un fichier texte? Si c'est le cas, je suggérerais de souligner ce point car c'est une sorte de définition peu intuitive; sinon, un léger changement de formulation pourrait aider à éviter la confusion.Je ne pense pas que ce soit possible avec la
echo
commande, utilisezsed
plutôt l'approche suivante :-i
- modifier le fichier sur place$
- indiquer le dernier enregistrement / lignes/$/abc/
- remplacer la fin de la ligne$
par une sous-chaîneabc
(pour le dernier enregistrement)la source
date >file; ls -i file; sed -i 's/201/ZZZ/' file; ls -i file
En supposant que le fichier ne se termine pas déjà par une nouvelle ligne et que vous souhaitez simplement ajouter du texte sans en ajouter un, vous pouvez utiliser l'
-n
argument, par exempleCependant, certains systèmes UNIX ne proposent pas cette option; si tel est le cas, vous pouvez utiliser
printf
, par exemple(l'
%s
argument initial étant de se prémunir contre le texte supplémentaire%
contenant des caractères de mise en forme)De
man echo
(sur macOS High Sierra):la source
echo -n
ne mettrait pas de nouvelle ligne à la fin deabc
, maisabc
serait toujours précédé d'une nouvelle ligne, ce que l'utilisateur veut éviter.\n
pas en premier lieu. Plus d'options sont meilleures, surtout lorsqu'elles n'impliquent pas d'avoir à réécrire le fichier entier chaque fois qu'un changement se produit (ce qui peut devenir assez lent et s'exécuter en temps polynomial s'il est répété).Si vous avez la
truncate
commande et que votre fichier texte a NL comme dernier caractère, vous pouvez le supprimer puis ajouter votre texte comme ceci:(Notez que
truncate
le contenu du fichier ne fait rien et, dans cet exemple, réduit simplement la taille du fichier d'un octet. Si votre dernier caractère n'est pas un seul octet, c'est-à-dire qu'il s'agit d'un caractère "large" à plusieurs octets, vous introduirez la corruption.)la source
Ce que vous voulez, c'est l'ajouter à la fin de la dernière ligne, donc juste avant le délimiteur de cette dernière ligne, donc juste avant le dernier caractère du fichier.
Avec
ksh93
, vous pouvez faire:Où
1<>
est l'opérateur standard pour ouvrir un fichier en mode lecture + écriture (et surtout sans troncature ) sur stdout et>#((...))
est un opérateur de recherche spécifique à ksh93 (ici pour rechercher avant le dernier octet). Notez queecho
écritabc<newline>
où lea
remplace la nouvelle ligne qui était là etecho
ajoute sa propre nouvelle ligne.L'
zsh
équivalent:Bien que pour un équivalent plus exact, vous devrez également imprimer un message d'erreur en cas d'échec de la recherche:
la source
Probablement un UUOC mais vous pourriez aussi faire:
Comme le souligne Gilles, cette commande est limitée:
Méfiez-
cat
vous également des fichiers que vous ne connaissez pas:Conclusion :
Utilisez sed
la source
echo
: pcat
, mais à des problèmes avec des séquences d'échappement arbitraires envoyées au terminal.