web-dev-qa-db-fra.com

Supprimer les lignes vides à l'aide de sed

J'essaie de supprimer les lignes vides en utilisant sed:

sed '/^$/d'

mais je n'ai pas de chance avec ça.

Par exemple, j'ai ces lignes:

xxxxxx


yyyyyy


zzzzzz

et je veux que ce soit comme:

xxxxxx
yyyyyy
zzzzzz

Quel devrait être le code pour cela?

303
jonas

Vous pouvez avoir des espaces ou des onglets dans votre ligne "vide". Utilisez classes POSIX avec sed pour supprimer toutes les lignes contenant uniquement des espaces:

sed '/^[[:space:]]*$/d'

Une version plus courte qui utilise ERE, par exemple avec gnu sed:

sed -r '/^\s*$/d'

(Notez que sed ne supporte pas PCRE ET.)

569
Kent

La solution awk me manque:

awk 'NF' file

Ce qui reviendrait:

xxxxxx
yyyyyy
zzzzzz

Comment cela marche-t-il? Puisque NF signifie "nombre de champs", les lignes vides ont 0 champs, de sorte que awk évalue 0 à faux et qu'aucune ligne n'est imprimée. toutefois, s'il existe au moins un champ, l'évaluation est True et permet à awk d'effectuer son action par défaut: imprimer la ligne en cours.

74
fedorqui

sed '/^$/d' devrait aller, attendez-vous à modifier le fichier en place? Si c'est le cas, vous devriez utiliser le drapeau -i.

Peut-être que ces lignes ne sont pas vides, alors si c'est le cas, regardez cette question Supprimez les lignes vides des fichiers txt, supprimez les espaces du début et de la fin de la ligne Je crois que c'est ce que vous essayez d'atteindre.

53
34
Oleg Mazko

Je crois que c'est le plus facile et le plus rapide:

cat file.txt | grep .

Si vous devez également ignorer toutes les lignes d'espaces, essayez ceci:

cat file.txt | grep '\S'

Exemple:

s="\
\
a\
 b\
\
Below is TAB:\
    \
Below is space:\
 \
c\
\
"; echo "$s" | grep . | wc -l; echo "$s" | grep '\S' | wc -l

les sorties

7
5
29
Vadim

Avec l'aide de la réponse acceptée ici et de la réponse acceptée ci-dessus, j'ai utilisé:

$ sed 's/^ *//; s/ *$//; /^$/d; /^\s*$/d' file.txt > output.txt

`s/^ *//`  => left trim
`s/ *$//`  => right trim
`/^$/d`    => remove empty line
`/^\s*$/d` => delete lines which may contain white space

Cela couvre toutes les bases et fonctionne parfaitement pour mes besoins. Bravo aux affiches originales @Kent et @kev

14
ConMan

Tu peux dire:

sed -n '/ / p' filename    #there is a space between '//'
5
tank

Ce comportement inattendu est probablement dû au fait que votre fichier texte a été créé sous Windows. La séquence de fin de ligne est donc \r\n. Vous pouvez utiliser dos2unix pour le convertir en fichier texte de style UNIX avant d’exécuter sed ou d’utiliser

sed -r "/^\r?$/d"

supprimer les lignes vides que le retour chariot soit ou non là.

2
FauChristian

Vous pouvez faire quelque chose comme ça en utilisant "grep", aussi:

egrep -v "^$" file.txt
2
Lowbit

Cela fonctionne aussi dans awk.

awk '!/^$/' file
xxxxxx
yyyyyy
zzzzzz
2
Claes Wikner

Ma réponse spécifique à bash- est de recommander l'utilisation de l'opérateur de substitution Perl avec l'indicateur de modèle global g, comme suit:

$ Perl -pe s'/^\n|^[\ ]*\n//g' $file
xxxxxx
yyyyyy
zzzzzz

Cette réponse illustre le fait de savoir si les lignes vides contiennent ou non des espaces ([\ ]*), ainsi que d'utiliser | pour séparer plusieurs termes/champs de recherche. Testé sur macOS High Sierra et CentOS 6/7.

FYI, le code original de l'OP sed '/^$/d' $file fonctionne parfaitement dans bash Terminal sur macOS High Sierra et CentOS 6/7 Linux sur un cluster de calcul intensif hautes performances.

0
justincbagley