La suppression de Windows retours à la ligne sur Linux (sed vs awk)
Ont certains des fichiers délimités par des avec mal placé caractères de saut de ligne dans le milieu de champs (pas de ligne se termine), apparaissant comme des ^M dans Vim. Ils proviennent de freebcp (sur Centos 6) exportations de base de données MSSQL. Dumping les données en hexadécimal montre \r\n motifs:
$ xxd test.txt | grep 0d0a
0000190: 3932 3139 322d 3239 3836 0d0a 0d0a 7c43
Je peux les enlever avec awk, mais je suis incapable de faire de même avec le sed.
Cela fonctionne dans awk, enlever les sauts de ligne complètement:
awk 'gsub(/\r/,""){printf $0;next}{print}'
Mais cela sed ne pas, en laissant la ligne de flux en place:
sed -i 's/\r//g'
où cela semble avoir aucun effet:
sed -i 's/\r\n//g'
À l'aide de ^M dans l'expression sed (ctrl+v, ctrl+m) ne semble pas fonctionner.
Pour ce genre de tâches, sed est plus facile de grok, mais je suis en train de travailler sur l'apprentissage plus sur les deux. Suis-je à l'aide de sed mal, ou est-il une limite?
- Avez-vous essayé avec le cite:
sed -e s/"^M"//g
? - Fonctionne comme prévu pour moi, avec GNU sed 4.2.1...
- dont le motif est travail pour vous? J'ai la même version de sed.
sed 's/\r//g'
, même avecPOSIXLY_CORRECT=1
. La deuxième, bien sûr, ne fait rien, parce que\n
ne fait pas partie du modèle de l'espace.- Ne que sed supprimer le \r\n habitudes, ou de les remplacer par \n? Sur mon système de remplacement se produit, non pas une suppression.
Vous devez vous connecter pour publier un commentaire.
Je crois que certaines versions de
sed
ne reconnaîtra pas\r
comme un personnage. Toutefois, vous pouvez utiliser unbash
fonction pour contourner cette limitation:Ici, vous laissez
bash
remplacer "\r " avec le caractère de retour chariot à l'intérieur de la$'...'
construire avant de les transmettre qu'àsed
comme sa commande. (En supposant que vous utilisezbash
; d'autres coquilles doivent avoir une même construire.)Vous pouvez utiliser l'outil de ligne de commande
dos2unix
Ou utiliser le
tr
commande:Fait, vous pouvez faire le fichier-format de commutation dans
vim
:Méthode Un:
Méthode B:
MODIFIER
Si vous souhaitez supprimer le
\r\n
séquences dans le fichier, essayez ces commandes dansvim
:Votre
awk
solution fonctionne très bien. Deux autressed
solutions:dos2unix
ne fonctionne pas? Vous pouvez poster votre échantillon d'entrée/sortie de fichier?:%s/^V^M//
. Le Ctrl-V provoque le Ctrl-M échappé, de sorte que vous pouvez inclure dans l'expression. Je le fais dans FreeBSD et OSXvi
tout le temps.Une autre méthode
\r\n
1
est toujours vrai, et en l'absence d'un bloc action{print}
est utilisésed -e 's/\r//g' input_file
Cela fonctionne pour moi. La différence de -e au lieu de -je commande.
Je l'ai mentionné que le voir sur différentes plates-formes se comportent différemment.
Le mien est:
sed --version
This is not GNU sed version 4.0