Y at-il un problème avec sed et new line character?
J'ai un fichier test.txt avec le contenu suivant
aaaaa
bbbbb
ccccc
ddddd
Ce qui suit ne fonctionne pas:
sed -r -i 's/\n/,/g' test.txt
Je sais que je peux utiliser tr
pour cela, mais ma question est de savoir pourquoi cela ne semble pas possible avec sed.
S'il s'agit d'un effet secondaire du traitement du fichier ligne par ligne, je voudrais savoir pourquoi cela se produit. Je pense grep
supprime de nouvelles lignes. Est-ce que Sed fait la même chose?
tr
ajouterait une fin,
et produirait une ligne non terminée. Le mieux est d'utiliser à lapaste
place:paste -sd , test.txt
Réponses:
Avec GNU
sed
et fourniPOSIXLY_CORRECT
n’est pas dans l’environnement (pour une entrée sur une seule ligne):De https://stackoverflow.com/questions/1251999/sed-how-can-i-replace-a-newline-n :
:a
N
$!ba
($!
signifie ne pas le faire sur la dernière ligne (car il devrait y avoir une nouvelle ligne finale)).la source
ba: Event not found
sed
commande ci-dessus avec ces options exactes? Sur queltest.txt
dossier? Avec quelle version desed
(essayersed --version
)?!
. Fait intéressant, cela ne fonctionnait toujours pas pour moi et j'ai fini par devoir échapper deux fois!
à mon.csh
script. Donc, je n'ai pas vraiment de problème pour le moment, mais vous savez pourquoi cela pourrait être? Ce qui a fonctionné pour moi a étésed :a;N;$\\!ba;s/\n/ /g'
Cela fonctionne avec GNU
sed
:-z
est inclus depuis 4.2.2NB
-z
change le délimiteur en caractères nuls (\0
). Si votre entrée ne contient aucun caractère NULL, toute l'entrée est traitée comme une seule ligne. Cela peut venir avec ses limites .Pour éviter de remplacer la nouvelle ligne de la dernière ligne, vous pouvez la rétablir:
(Ce qui est
sed
encore une fois la syntaxe GNU , mais cela n'a pas d'importance car tout est uniquement GNU)la source
Sur le site Web d'Oracle:
En gros, cela signifie que, parce que sed lit ligne par ligne, le caractère de nouvelle ligne ne correspond pas.
La solution de https://stackoverflow.com/questions/1251999/sed-how-can-i-replace-a-newline-n est la suivante:
ou, dans une version portable (sans
;
enchaîner après les étiquettes de saut)Une explication de la façon dont cela fonctionne est fournie sur cette page.
la source
sed
, si POSIXLY_CORRECT est dans l'environnement et que l'entrée n'a qu'une seule ligne, il n'y aura pas de sortie.sed
supprime toujours la fin de ligne\n
ewline juste avant de remplir l’espace de modèle, puis en ajoute un avant d’écrire les résultats de son script. Une\n
ewline peut être créée dans l'espace des motifs de différentes manières - mais jamais si elle ne résulte pas d'une modification. Ceci est important - les\n
espaces danssed
l'espace de modèle de s reflètent toujours un changement et ne se produisent jamais dans le flux d'entrée.\n
les lignes sont le seul délimiteur ased
peut compter avec une entrée inconnue.Si vous souhaitez remplacer toutes les
\n
lignes par des virgules et que votre fichier n'est pas très volumineux, vous pouvez procéder comme suit:Cela ajoute chaque ligne d’entrée à l’
h
ancien espace - à l’exception de la première, qui remplace l’h
ancien espace - à la suite d’un\n
caractère ewline. Ild
supprime ensuite chaque ligne, pas la$!
dernière de la sortie. Sur la dernière ligneH
, les espaces et les espaces de modèle sontx
modifiés et tous les\n
caractères ewline sont convertisy///
en virgules.Pour les fichiers volumineux, ce type de problème est inévitablement source de problèmes -
sed
la mémoire tampon de la ligne de démarcation peut être facilement surchargée d'actions de ce type.la source
Alternativement, vous pouvez utiliser une syntaxe légèrement plus simple:
... juste changer l'ordre de la séquence.
la source
s
commande pour chaque ligne d'entrée sur un espace de modèle de plus en plus grand.Il y a une très belle magie sed ici. Et quelques bons points soulevés au sujet du débordement d’espace-modèle J'adore utiliser sed, même si ce n'est pas la méthode la plus simple, car elle est si compacte et puissante. Cependant, il a ses limites et pour de grandes quantités de données, l'espace de modèle devrait être mahoosif.
GNU dit ceci:
Je n'ai pas grand chose à ajouter, mais je voudrais vous indiquer mon guide de référence pour sed . C'est excellent. http://www.grymoire.com/Unix/Sed.html
et voici ma solution:
bien ça marche
la source
Disons que vous voulez remplacer les nouvelles lignes par
\n
. Je voulais faire ça, alors voici ce que j'ai fait:Voici ce que cela fait: pour toutes les lignes sauf la dernière , ajouter
\n
. Ensuite, supprimez les nouvelles lignes avectr
.la source
-r
est uniquement disponible dans GNUsed
, pas BSD.