J'exécute les 2 sed
commandes suivantes. Le premier ajoute des caractères de nouvelle ligne là où je les veux, le second ajoute également des caractères de nouvelle ligne là où je les veux, MAIS ajoute également un caractère supplémentaire à la fin du fichier là où il n'y en avait pas auparavant.
sed -e 's|\<LIST_G_STATEMENT>|&\
|g' ${XMLDIR}/statement_tmp_1.xml > ${XMLDIR}/statement_tmp_2.xml
sed -e 's|\</LIST_G_STATEMENT>|&\
|g' ${XMLDIR}/statement_tmp_2.xml > ${XMLDIR}/statement_tmp_3.xml
L'utilisation od -c
sur les 3 fichiers donne la sortie suivante.
statement_tmp_1.xml (non \n
à la fin du fichier)
1314700 T A T E M E N T > < / L I S T _
1314720 G _ S T A T E M E N T > < / G _
1314740 S E T U P > < / L I S T _ G _ S
1314760 E T U P > < / A R X S G P O >
1314777
statement_tmp_2.xml (non \n
à la fin du fichier)
1314700 S T A T E M E N T > < / L I S T
1314720 _ G _ S T A T E M E N T > < / G
1314740 _ S E T U P > < / L I S T _ G _
1314760 S E T U P > < / A R X S G P O >
1315000
statement_tmp_3.xml ( \n
à la fin du fichier - d'où vient-il?)
1314700 S T A T E M E N T > < / L I S T
1314720 _ G _ S T A T E M E N T > \n < /
1314740 G _ S E T U P > < / L I S T _ G
1314760 _ S E T U P > < / A R X S G P O
1315000 > \n
1315002
J'utilise AIX 5.3
Fondamentalement, je veux qu'il arrête d'ajouter le supplément \n
ou que je trouve un moyen de le supprimer.
s|...|&\n|
aussi bien l' utiliser ?\n
dans le côté droit n'est pas portable.perl
un autre outil qui peut traiter des données binaires.\<LF>
c'est la manière traditionnelle et POSIX d'ajouter un caractère LF.\n
remplacerait généralement unn
caractère dans tout sauf GNUsed
.Réponses:
Vous devriez vous considérer chanceux car AIX a
sed
ajouté ces caractères de nouvelle ligne manquants.Un fichier non vide qui ne se termine pas par un caractère de nouvelle ligne n'est pas un fichier texte (au moins selon la définition POSIX d'un fichier texte) car un fichier texte est censé contenir des lignes et les lignes sont un (pas trop) longue) séquence de caractères terminée par un caractère de nouvelle ligne, de sorte que le comportement des utilitaires de texte comme
sed
celui-ci n'est pas spécifié et dans la pratique varie d'une implémentation à l'autre.Une
sed
mise en œuvre aurait rejeté ces faux caractères après la dernière ligne.AFAIK, les
xml
fichiers sont censés être des fichiers texte, donc cela signifiesed
simplement les avoir corrigés pour vous.Si vous avez besoin que ce fichier ne se termine pas par un caractère de nouvelle ligne, vous pouvez utiliser
perl
ou d'autres outils capables de gérer des données non textuelles.la source
sed
sortie vers tout autre utilitaire Unix standard. Honnêtement, je n'ai pas remarquésed
cela depuis des années , car les substitutions de commande du shell Bourne aiment$(sed 's/bas/replac/' <<<'basement')
couper furtivement la dernière ligne, s'il y en a une. Mais il y a des moments où vous n'en voulez absolument pas; par exemple , manipuler le texte du presse-papiers X avecsed
. FYI, GNU sed, si disponible, n'ajoute pas de nouvelle ligne de terminaison si vous l'utilisezp
avec l'-n
option, comme décrit dans cette réponse SE .Voici un moyen de supprimer la nouvelle ligne finale d'un fichier en utilisant
dd
:Pour tester si un fichier se termine par une nouvelle ligne, vous pouvez utiliser:
Et pour obtenir la taille du fichier en octets, utilisez:
la source
Selon ce AIX manuel IBM -
tail
t-r
Réverse - ce qui est plutôt cool. Tant que votre fichier est inférieur à 20 Ko, les éléments suivants devraient fonctionner:la source