web-dev-qa-db-fra.com

Supprimer toutes les lignes avant un match avec sed

J'utilise sed pour filtrer une liste de fichiers. J'ai une liste triée de dossiers et je veux obtenir toutes les lignes après une spécifique. Pour faire cette tâche, j'utilise la solution décrite ici qui fonctionne assez bien avec toutes les entrées que j'ai essayées mais cela ne fonctionne pas lorsque la correspondance est sur la première ligne. Dans ce cas, sed supprimera toutes les lignes de l'entrée

Voici un exemple:

(ssh) fabio@s2 : ~
[0] % ls -1 /
bin
boot
...
sys
tmp
usr
var
vmlinuz

(ssh) fabio@s2 : ~
[0] % ls -1 / | sed '1,/tmp/d'
usr
var
vmlinuz

(ssh) fabio@s2 : ~
[0] % ls -1 / | sed '1,/^bin$/d'
# sed will delete all lines from the input stream

Comment dois-je modifier la commande pour prendre également en compte le cas limite lorsque la première ligne correspond à l'expression rationnelle?

BTW sed '1,1d' fonctionne correctement et supprime uniquement la première ligne.

21
Fabio

essayez ceci (GNU sed uniquement):

sed '0,/^bin$/d'

..la sortie est:

 $ sed '0,/^ bin $/d' file 
 boot 
 ... 
 sys 
 tmp 
 usr 
 var 
 vmlinuz 
25
Endoro

Cette commande sed imprimera toutes les lignes après et y compris la ligne correspondante:

sed -n '/^WHATEVER$/,$p'

Le -n le commutateur fait que sed s'imprime uniquement quand on le lui dit (la commande p).

Si vous ne souhaitez pas inclure la ligne correspondante, vous pouvez demander à sed de supprimer du début du fichier à la ligne correspondante:

sed '1,/^WHATEVER$/d'

(Nous utilisons la commande d qui supprime les lignes.)

27
adamse

vous pouvez également essayer avec:

awk '/searchname/{p=1;next}{if(p){print}}'
7
Vijay

Je voudrais insérer une balise avant une correspondance et supprimer dans la portée /start/,/####tag####/.

0
rishta