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?
Réponses:
Vous pouvez avoir des espaces ou des tabulations dans votre ligne "vide". Utilisez les classes POSIX avec
sed
pour supprimer toutes les lignes contenant uniquement des espaces:Une version plus courte qui utilise ERE, par exemple avec gnu sed:
(Notez que sed ne prend PAS en charge PCRE.)
la source
-r
sed -i "" '/^[[:space:]]*$/d'
<filename>
,^\s*$
correspondra à toutes les lignes "vides", vide signifie ici, la ligne ne contient aucun caractère ou la ligne ne contient que des chaînes vides (par exemple des espaces). Toutes les lignes correspondantes seront supprimées par sed, avec lad
commande.Je manque la
awk
solution:Qui reviendrait:
Comment cela marche-t-il? Puisque
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 True et faitawk
effectuer son action par défaut: imprimer la ligne courante.la source
$ time (topic companies <data.tpx | awk 'NF' - | awk -f dialog_menu.awk -)
real 0m0.006s
user 0m0.000s
sys 0m0.008s
$ time (topic companies <data.tpx | gsed '/^\s*$/d' | awk -f dialog_menu.awk -)
real 0m0.014s
user 0m0.002s
sys 0m0.006s
Connaissez-vous un moyen astucieux de l'inclure dans un script awk comme, par exemple, un modèle? awk '/ mypattern / {do stuff ...}'awk 'NF {do stuff...}'
.sed '/^$/d'
devrait être bien, prévoyez-vous de modifier le fichier en place? Si c'est le cas, vous devez utiliser le-i
drapeau.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 du début et de la fin de la ligne Je pense que c'est ce que vous essayez d'atteindre.
la source
sed -i '/^$/d'
est une façon de le faire.sed
'/^[[:space:]]*$/d'
'/^\s*$/d'
'/^$/d'
-n '/^\s*$/!p'
grep
.
-v '^$'
-v '^\s*$'
-v '^[[:space:]]*$'
awk
/./
'NF'
'length'
'/^[ \t]*$/ {next;} {print}'
'!/^[ \t]*$/'
la source
[]
doivent pas être échappés dans une expression entre crochets, donc le code ici n'est pas correct pour\[\[:space:\]\]
ou\[ \t\]
- devrait être[[:space:]]
et[ \t]
.Je pense que c'est le plus simple et le plus rapide:
Si vous devez également ignorer toutes les lignes d'espace blanc, essayez ceci:
Exemple:
les sorties
la source
cat
,grep
prend également les fichiers:grep . file.txt
grep '\S'
n'est certainement pas portable. Si vous l'avez,grep -P
vous pouvez l'utiliser,grep -P '\S'
mais ce n'est pas pris en charge sur toutes les plateformes non plus.grep .
par rapport aux autres solutions est qu'il mettra en évidence tout le texte en rouge. Les autres solutions peuvent conserver les couleurs d'origine. Comparerunbuffer apt search foo | grep .
avecunbuffer apt search foo | grep -v ^$
Avec l'aide de la réponse acceptée ici et de la réponse acceptée ci-dessus, j'ai utilisé:
Cela couvre toutes les bases et fonctionne parfaitement pour mes besoins. Bravo aux affiches originales @Kent et @kev
la source
Tu peux dire:
la source
print all lines except the empty one(s)
et taisUne autre option sans
sed
,awk
,perl
, etc.strings - imprime les chaînes de caractères imprimables dans les fichiers.
la source
strings
au lieu destring
?Vous pouvez aussi faire quelque chose comme ça en utilisant "grep":
la source
Cela fonctionne également en awk.
la source
Vous voyez très probablement le comportement inattendu car votre fichier texte a été créé sur Windows, donc la séquence de fin de ligne est
\r\n
. Vous pouvez utiliser dos2unix pour le convertir en un fichier texte de style UNIX avant d'exécuter sed ou d'utiliserpour supprimer les lignes vides, que le retour chariot soit présent ou non.
la source
-r
drapeau et est-il possible de le combiner avec-i
pour modifier le fichier directement et éviter d'imprimer à l'écran. De plus, je pense que cette commande fonctionnerait également commesed -r "/^\r$/d"
Ma
bash
réponse spécifique est de recommander l'utilisation d'perl
un opérateur de substitution avec le modèle globalg
indicateur de pour cela, comme suit:Cette réponse illustre la prise en compte de la présence ou non d'espaces dans les lignes vides (
[\ ]*
), ainsi que l'utilisation|
pour séparer plusieurs termes / champs de recherche. Testé sur macOS High Sierra et CentOS 6/7.Pour info, le code original de l'OP
sed '/^$/d' $file
fonctionne très bien dansbash
Terminal sur macOS High Sierra et CentOS 6/7 Linux sur un cluster de superordinateurs hautes performances.la source
Pour moi, avec FreeBSD 10.1 avec sed n'a fonctionné que cette solution:
à l'intérieur
[]
il y a des symboles d'espace et de tabulation.le fichier de test contient:
la source