web-dev-qa-db-fra.com

Comment supprimer les lignes vides du début et de la fin du fichier?

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
10
Feriman

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.

5
Stack EG

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)"
7
glenn jackman

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
5
guillermo chamorro

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îne
5
Sundeep

Une 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 /./.

1
Ed Morton

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.

0
Paul_Pedant