Je voudrais supprimer les lignes vides du début et de la fin du fichier, mais pas les lignes vides entre les lignes. Je pense que sed
ou awk
serait la solution.
La source:
1:
2:
3:line1
4:
5:line2
6:
7:
8:
Production:
1:line1
2:
3:line2
Essaye ça,
Pour supprimer des lignes vides au début d'un fichier:
sed -i '/./,$!d' filename
Pour supprimer des lignes vides à la fin d'un fichier:
sed -i -e :a -e '/^\n*$/{$d;N;ba' -e '}' file
Pour supprimer des lignes vides du début et de la fin d'un fichier:
sed -i -e '/./,$!d' -e :a -e '/^\n*$/{$d;N;ba' -e '}' file
De l'homme sed,
-e script, --expression = script -> ajouter le script aux commandes à exécuter
étiquette b -> Branche à étiqueter; si l'étiquette est omise, branchez-vous à la fin du script.
a -> Ajouter du texte après une ligne (syntaxe alternative).
$ -> Correspond à la dernière ligne.
n N -> Ajoutez une nouvelle ligne à l'espace modèle, puis ajoutez la ligne d'entrée suivante à l'espace modèle. S'il n'y a plus d'entrée, sed quitte sans traiter d'autres commandes.
Ce petit programme awk supprimera les lignes vides au début d'un fichier:
awk 'NF {p=1} p'
Nous pouvons donc combiner cela avec tac
qui inverse les lignes et obtient:
awk 'NF {p=1} p' file | tac | awk 'NF {p=1} p' | tac
line1
line2
Vol @ guillermo chamorro's astuce de substitution de commande:
awk 'NF {p=1} p' <<< "$(< file)"
Je propose ceci:
printf '%s\n' "$(cat file)" | sed '/[a-z]/,$!d'
Il imprimera tout le texte sauf les lignes vides de début et de fin. Donc, si nous étendons l'exemple:
(blank)
(blank)
line1
line2
line1
line2
line1
line2
line1
line2
(blank)
(blank)
Il produira:
line1
line2
line1
line2
line1
line2
line1
line2
Si le fichier est suffisamment petit pour répondre aux exigences de mémoire:
$ Perl -0777 -pe 's/^\n+|\n\K\n+$//g' ip.txt
line1
line2
-0777
à Slurp tout le fichier d'entrée^\n+
une ou plusieurs nouvelles lignes depuis le début de la chaîne\n\K
pour empêcher la suppression du caractère de nouvelle ligne de la dernière ligne non vide\n+$
un ou plusieurs sauts de ligne à la fin de la chaîneUne approche simple en 2 passes juste pour être complet:
$ awk 'NR==FNR{if (NF) { if (!beg) beg=NR; end=NR } next} FNR>=beg && FNR<=end' file file
line1
line2
Ce qui précède traite les lignes de caractères vides uniquement comme vides. Si, à la place, vous voulez que les lignes sans aucun caractère soient considérées comme vides, changez simplement NF
en /./
.
Pas écrit le code, mais il doit y avoir un algorithme efficace pour tout fichier de taille dans ce sens.
(a) Lisez et ignorez les lignes vides jusqu'au premier non vide.
(b) Lisez et imprimez les lignes non vides jusqu'à la prochaine vide.
(c) Compter (n) les lignes vides jusqu'à la prochaine non vide.
(d) Si vous frappez non vide, imprimez n nouvelles lignes et vous êtes de retour dans l'état (b).
(e) Si vous touchez EOF, vous avez terminé - jeté n lignes vides avant EOF.