Supprimer les lignes vides en utilisant 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?

250
demandé sur Benjamin W. 2013-05-07 12:20:18

12 réponses

vous pouvez avoir de l'espace/des onglets dans votre ligne" vide". Si c'est le cas, cela aidera:

sed '/^\s*$/d'

utilise \s pour correspondre à n'importe quel caractère d'espace.

489
répondu Kent 2017-02-07 17:57:34

sed '/^$/d' ça devrait aller, vous pensez modifier le fichier en place? Si c'est le cas, vous devez utiliser le drapeau -i .

peut-être que ces lignes ne sont pas vides, donc si c'est le cas, regardez cette question supprimer les lignes vides des fichiers TXT, supprimer les espaces de début et de fin de ligne je crois que c'est ce que vous essayez d'atteindre.

49
répondu Alberto Zaccagni 2017-05-23 12:10:30

il me manque la solution awk :

awk 'NF' file

qui reviendrait:

xxxxxx
yyyyyy
zzzzzz

comment ça marche? Depuis NF signifie" nombre de champs", ces lignes étant vides ont 0 fiedls, de sorte que awk évalue 0 à False et aucune ligne n'est imprimée; cependant, s'il y a au moins un champ, l'évaluation est vraie et fait awk effectuer son action par défaut: Imprimer la ligne courante.

47
répondu fedorqui 2015-11-30 11:11:57

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

cat file.txt | grep .

si vous avez besoin d'Ignorer toutes les lignes de l'espace blanc aussi bien alors 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

sorties

7
5
21
répondu Vadim 2014-10-17 03:26:56

Avec l'aide de la réponse acceptée ici et 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 à mes besoins. Félicitations aux affiches originales @Kent et @kev

13
répondu ConMan 2017-05-23 11:54:58

vous pouvez dire:

sed -n '/ / p' filename    #there is a space between '//'
3
répondu tank 2015-04-02 12:50:45

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

egrep -v "^$" file.txt
2
répondu Lowbit 2014-08-11 17:20:41

cela fonctionne aussi en awk.

awk '!/^$/' file
xxxxxx
yyyyyy
zzzzzz
2
répondu Claes Wikner 2016-08-25 11:03:45

vous voyez très probablement le comportement inattendu parce que votre fichier texte a été créé sur Windows, de sorte que la séquence de fin de ligne est \r\n . Vous pouvez utiliser dos2unix pour le convertir en fichier texte de style UNIX avant d'exécuter sed ou utiliser

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

pour supprimer les lignes vides, qu'il y ait ou non le retour du chariot.

2
répondu FauChristian 2018-08-10 13:53:18

ma réponse spécifique bash est de recommander l'utilisation de l'opérateur de substitution perl avec l'indicateur global pattern g comme suit:

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

cette réponse illustre si les lignes vides comportent ou non des espaces ( [\ ]* ), ainsi que l'utilisation de | 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 très bien dans bash Terminal sur macOS High Sierra et CentOS 6/7 Linux à un cluster de superinformatique haute performance.

0
répondu justincbagley 2018-07-24 22:20:50

pour moi avec FreeBSD 10.1 avec sed n'a fonctionné que cette solution:

sed -e '/^[     ]*$/d' "testfile"

à l'intérieur [] il y a de l'espace et de l'onglet symboles.

fichier test contient:

fffffff next 1 tabline ffffffffffff

ffffffff next 1 Space line ffffffffffff

ffffffff empty 1 lines ffffffffffff

============ EOF =============
-3
répondu Vitaly 2017-08-16 14:44:34