J'ai ceci:
sed -i '/^$/d' temp_spec.rb
qui supprime les lignes blanches et fonctionne bien. Comment puis-je le faire uniquement pour les lignes 5-999 (ou idéalement 5 à la fin du fichier).
J'ai essayé:
sed -n5,999 -i '/^$/d' temp_spec.rb
sed '5,999!d/^$/d' temp_spec.rb
mais aucun n'a fonctionné (pas d'erreurs).
Réponses:
Si vous souhaitez supprimer toutes les lignes vides commençant par la ligne 5 et conserver les lignes 1 à 4, vous pouvez utiliser
L'
{
opérateur de regroupement est donc la première commande5,${
signifie "de la ligne 5 jusqu'à la fin de input ($
) exécuter les commandes suivantes jusqu'à la correspondance}
". Les commandes entre{
et}
peuvent à nouveau être préfixées par des adresses, donc la commande interne/^$/d
signifie "s'il n'y a rien entre le début (^
) et la fin ($
) de la ligne, supprimez-la". Les commandes sed peuvent être séparées par;
. (Il s'agit d'une fonctionnalité mal documentée de sed. Elle est prise en charge par la plupart des implémentations sed, mais elle n'est pas entièrement portable .) Comme indiqué par Hauke, l';
after{
est facultatif; la précédente}
est cependant requise.Si vous souhaitez supprimer toutes les lignes vides commençant par la ligne 5 et également supprimer les lignes 1 à 4, c'est plus simple:
la source
;
.;
.Une autre option en utilisant awk:
la source
Modifier 1:
Je suis censé expliquer cela, donc ...
C'est inutilement compliqué. Je ne savais pas que les plages d'adresses sont autorisées à l'intérieur
{}
. J'ai donc dû exprimer «supprimer les lignes vides» différemment. La commande principale estt
celle de sedif ... then
.T
aurait été plus facile mais n'est disponible que pour GNU sed. Je cite la page de manuel:J'abuse de la fameuse
s
commande. Il ne remplacera rien mais testera seulement si la ligne est vide. Donc, il remplace une ligne vide par une ligne vide (pourrait utiliser n'importe quoi comme remplacement car la ligne est supprimée de toute façon).Si
s
a fait un "remplacement" alors la ligne est vide. Dans ce cas, la commanded
doit être exécutée. Sinon, rien ne doit être fait. Commet
ne saute pas en cas d's
action j'ai besoin de la commande branchb
pour sauter à la fin du script.: label
sont des cibles de branche. Commegoto
à l'époque dans les âges sombres (quand sed a été inventé ... te-hee).Une autre option serait de
s
"remplacer" toutes les lignes non vides, ce qui rend la commandes
plus compliquée mais plus simple:^..*$
signifie "ligne non vide" et\1
signifie "le contenu des premières parenthèses".la source