2010-11-22 8 views
2

Je veux supprimer les lignes 'troisième' et les espaces vides de my.txt ci-dessous, puis stocker le o/p dans my.txt quelle devrait être la commande sed? Note: cela devrait être dans une boucle jusqu'à la fin du fichierComment supprimer du texte ou des lignes vides avec sed?

my.txt - 

first 

sec 


third 


third 

third 

Répondre

1
sed -i 's/third//g' my.txt 

modifierait le fichier en place.

+2

Cela ne supprimera pas la ligne, il suffit de remplacer « troisième » par la chaîne vide. –

+0

@Sean: En effet; Je suppose que j'ai mal lu la question. –

2

Vous pouvez le faire:

sed -i -r '/^(third|)$/d' my.txt 
+0

Cela utilise une expression régulière étendue que le standard (POSIX) 'sed' ne supporte pas. Ce n'est pas faux - c'est juste une extension qui devrait être notée. –

4

En utilisant GNU sed, l'écrasement en écriture est trivial avec l'option '-i'; En utilisant sed standard, vous devez écrire dans un fichier temporaire, puis le copier sur l'original.

Les autres réponses sont antérieures à l'exigence «lignes vides» dans la question.

sed -i '/third/d;/^[ ]*$/d' my.txt 

La première partie de la commande, jusqu'au point-virgule, recherche «troisième» et supprime toute ligne correspondante. La deuxième partie de la commande recherche toute ligne composée de zéro ou plusieurs espaces et les supprime. Si vous souhaitez supprimer des lignes avec des espaces et des tabulations, ajoutez un onglet dans la classe de caractères. Il n'existe pas de méthode pratique pour afficher les onglets dans le langage de balisage SO.

Vous pouvez équivalente à écrire:

sed -i -e '/third/d' -e '/^[ ]*$/d' my.txt 

Et pour sed non-GNU, vous utilisez:

sed '/third/d;/^[ ]*$/d' my.txt > x.$$ 
cp x.$$ my.txt 
rm -f x.$$ 
+0

Sans GNU sed, une alternative est d'utiliser 'ed'. Bien que les commandes soient les mêmes, la syntaxe globale est différente. – mouviciel

+0

Vous pouvez utiliser '\ t' dans votre classe de caractères (' [\ t] ') ou utiliser' [[: blank:]] '(espace ou tabulation) ou' [[: space:]] '(dans POSIX locale: espace, tabulation, retour à la ligne, retour chariot, saut de page et tabulation verticale Dans le dernier exemple, il vaut mieux faire 'sed ... && cp ...' pour que le fichier original ne soit pas perdu si le 'sed' –

+0

@Dennis: Vous avez probablement raison sur '' \ t '' pour GNU sed, mais le standard POSIX ne le reconnaît pas, pas plus que Solaris 10 (pour ne citer qu'une plate-forme où GNU sed n'est pas le Superficiellement, Solaris 10 sed semble reconnaître '[[: blank:]]' etc, mais il ne semble pas agir sur eux.Tout le monde n'utilise pas GNU.Vous avez raison à propos de la copie conditionnelle –

0

sed est un éditeur de flux , à savoir qu'il est pour l'édition ruisseaux (pipes) pas de fichiers. Si vous souhaitez modifier des fichiers, vous devez utiliser un éditeur de fichiers tels que ed:

ed my.txt <<-HERE 
    ,g/^third$/d 
    ,g/^$/d 
    w 
    q 
HERE 
+0

Quelle est la signification des virgules précédant les commandes globales? –

+0

@Jonathan Leffler: C'est l'adresse. 'A, b' signifie" de la ligne 'a' à ligne 'b'". La valeur par défaut de 'a' est' 1', la valeur par défaut de 'b' est' $ ', c'est-à-dire la dernière ligne. Ergo, ',' signifie "de la ligne' 1' à la dernière ligne ", IOW le fichier entier. Puisque 'ed' est un éditeur de fichiers, il peut réellement se déplacer dans le fichier, donc toutes les commandes prennent une adresse. 'sed' OTOH ne peut pas s'attendre à pouvoir le faire, car vous ne pouvez généralement pas revenir en arrière dans un flux. –

+0

OK: J'ai toujours simplement utilisé 'g/^ third $/d' car l'étendue de la recherche globale est le fichier entier sauf si vous spécifiez le contraire. Si je voulais limiter l'opération à la ligne précédente commençant par 'x' à la ligne suivante commençant par 'z', alors '?^X?,/^ Z/g/^ troisième $/d', par exemple. Mais il ne m'était pas venu à l'esprit d'ajouter la virgule - et je ne le ferai probablement pas dans ces occasions bizarres où j'utilise 'ed'. –

Questions connexes