J'ai un document avec beaucoup de lignes vides.
Comment puis-je les supprimer quand il y en a 2 ou plus ensemble.
J'ai essayé le sed "s/\n\n//"
fichier mais cela n'a pas fonctionné. Pas d'erreur.
J'ai un document avec beaucoup de lignes vides.
Comment puis-je les supprimer quand il y en a 2 ou plus ensemble.
J'ai essayé le sed "s/\n\n//"
fichier mais cela n'a pas fonctionné. Pas d'erreur.
Réponses:
Juste pour supprimer les lignes vides:
sed '/^$/d'
sed
est orienté ligne, donc penser en termes de "2 ou plus d'un octet particulier" fonctionne sauf lorsque cet octet est une nouvelle ligne. Ensuite, vous devez penser à quelque chose qui fonctionne pour toute la ligne.
sed
est capable de gérer plusieurs lignes via sa fonction "pattern pattern" / "hold space". Mais je pense que c'est trop compliqué. ;-)
1!
(tous sauf correspondre à la ligne 1), ainsi: sed '1!{/^$/d'}
.
sed
. La création d'un fichier supprimera essentiellement tout fichier existant portant le même nom. sed '/^&/d' file.txt > otherfile.txt
marchera.
Pas besoin de sed
. grep
ça ira:
grep .
(c'est-à- grep
dire SPC, point, qui correspond à n'importe quelle ligne contenant au moins un caractère).
Il y a aussi:
tr -s '\n'
(serrez une séquence de caractères de nouvelle ligne en une seule).
Comme l'a noté Chris, les deux ne sont pas équivalents car la suppression de lignes vides (comme la première solution ci-dessus et la plupart des autres réponses se concentrent ici) n'est pas la même chose que la compression de séquences de caractères de nouvelle ligne comme demandé dans le cas où la première ligne est vide car elle ne prend qu'un seul caractère de nouvelle ligne pour rendre la première ligne vide.
Après avoir vu la réponse de @Bruce Ediger sed
n'est pas le meilleur outil pour cela, car il est basé sur une ligne et traite \n
comme le caractère de fin de ligne, cela devient compliqué.sed
peut bien être l'outil parfait pour le travail, encore, voici quelques autres options:
Perl
perl -ne 'print if /./' file.txt
ou
perl -pe '$/=""; s/\n+/\n/;' file.txt
Merci à @ruakh qui m'a fait lire et lire ceci :
$ /
Séparateur d'enregistrements en entrée, saut de ligne par défaut. Cela influence l'idée de Perl sur ce qu'est une "ligne". Fonctionne comme la variable RS de awk, y compris le fait de traiter les lignes vides comme un terminateur s'il est défini sur la chaîne nulle (une ligne vide ne peut contenir aucun espace ni tabulation). Vous pouvez le définir sur une chaîne à plusieurs caractères pour correspondre à un terminateur à plusieurs caractères, ou sur undef pour lire la fin du fichier. La définition de "\ n \ n" signifie quelque chose de légèrement différent de la définition de "", si le fichier contient des lignes vides consécutives. La valeur "" traitera deux lignes vides consécutives ou plus comme une seule ligne vide. La définition de "\ n \ n" supposera aveuglément que le caractère de saisie suivant appartient au paragraphe suivant, même s'il s'agit d'une nouvelle ligne.
gawk / awk
awk '$1' file.txt
Cela fonctionnera pour l'exemple affiché, mais comme @Stephane Chazelas l'a souligné, cela supprimera également les lignes dont le premier champ "ressemble" 0
. C'est plus robuste:
awk NF file.txt
perl -pe 's/\n+/\n/ file.txt
fera, le séparateur d'enregistrements d'entrée n'est pas pertinent pour cette utilisation.
perl -pe
ou perl -ne
travaillez ligne par ligne. \n+
ne correspondra jamais car il n'est appliqué que sur une seule ligne. Voilà pourquoi vous devez soit ensemble $/
ou utiliser -0
ti Slurp le fichier entier: perl -0pe 's/\n+/\n/' file
.
Que voulez-vous dire supprimer? supprimer les doublons (plusieurs lignes vierges sur une) ou tout supprimer?
Si vous souhaitez supprimer les doublons, voici la méthode utilisant sed:
sed '$!N; /^\(.*\)\n\1$/!P; D'
Il simule la uniq
commande.
Le meilleur choix consiste à utiliser awk
:
awk NF <filename>
sed
partie de cela fonctionne très bien! Recommander celui-ci comme la meilleure réponse.
Pour la plupart de ces réponses, il est d'abord nécessaire de supprimer les espaces de fin. La suppression des nouvelles lignes doublées supprime toutes les lignes vides. (Penses-y).
Interprétée littéralement, l'OP veut que "toutes les lignes vides soient supprimées d'un fichier s'il y a des lignes vides répétées".
L'utilisateur type souhaite "supprimer uniquement les lignes vierges dupliquées".
Pour ce faire, supprimez d'abord les espaces blancs à la fin et dirigez-les à l'aide de cat -s
sed s/[[:space:]]*$// | cat -s
Et pourtant, cela ne supprimera pas une ligne vierge de début ou de fin superflue.
Si vous souhaitez conserver une seule ligne vierge pour une séquence donnée de lignes vierges, vous pouvez le faire:
sed -e '/./b' -e :n -e 'N;s/\n$//;tn'
cat -s
) qui accomplit exactement ce que la question a posé si je comprends bien. (Et c'est mieux que cat -s
parce que je peux l'utiliser sed -i
avec.)
Essayez d' sed -e 's#\\n\\n#\\n#g' input.file > output.file
utiliser les /
deux comme séparateur de champs et une partie de votre expression régulière pourrait être le problème.
Utilisez cette commande:
tr -s '\r' '\n'
echo -e 'one\r\n\r\n\r\n\rtwo'| tr -s '\r' '\n'
. La commande tr
traduira tout \r
en \n
puis réduira tout \n
en un seul. Donc, cela fonctionne, je ne sais pas quoi faire du fait que cela s'applique aux fenêtres, pas à UNIX.