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?
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.)
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.
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.
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
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
Tu peux dire:
sed -n '/ / p' filename #there is a space between '//'
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à.
Vous pouvez faire quelque chose comme ça en utilisant "grep", aussi:
egrep -v "^$" file.txt
Cela fonctionne aussi dans awk.
awk '!/^$/' file
xxxxxx
yyyyyy
zzzzzz
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.