Sed suppression N 1ères lignes ki efface tout [Résolu/Fermé]

Signaler
-
Messages postés
36299
Date d'inscription
dimanche 7 novembre 2010
Statut
Contributeur
Dernière intervention
27 janvier 2021
-
Bonjour,

je souhaite supprimer toutes les lignes avant la ligne qui contient la chaine de caractères suivante : #DATA
dans plusieurs fichiers texte.

Je fais :

find "/home/user/donnes/" -maxdepth 1 -name "*.txt" -type f -exec sed -i.bak '1,/^\#DATA/d' {} \;

Si les fichiers contiennent #DATA ça marche.
Mais si ces lignes ont déjà été supprimées, ça effacer l'intégralité de ces fichiers et ça c'est pas bon du tout.

Une idée ?
Peut-être qu'il faut simplement remplacer le 'sed -i.bak '1,/^\#DATA/d' par autre chose ? Je ne vois pas.

Merci et bonne fin d'après-midi.

3 réponses

Messages postés
36299
Date d'inscription
dimanche 7 novembre 2010
Statut
Contributeur
Dernière intervention
27 janvier 2021
6 227
Salut,

Si les fichiers sont dans le même répertoire pas la peine de "find" :

$ ls -1
tata.txt
titi.txt
toto.txt
tutu.txt

$ head t*
==> tata.txt <==
bla
blablla
#DATA
bli
blibli
bli

==> titi.txt <==
bla
blablla
#DATA
bli
blibli
bli

==> toto.txt <==
bla
blablla
#DATA
bli
blibli
bli

==> tutu.txt <==
bla
blablla
#DATA
bli
blibli
bli

$ sed -s -i.bak '1,/^#DATA/d' t*

$ ls -1
tata.txt
tata.txt.bak
titi.txt
titi.txt.bak
toto.txt
toto.txt.bak
tutu.txt
tutu.txt.bak

$ head t*
==> tata.txt <==
bli
blibli
bli

==> tata.txt.bak <==
bla
blablla
#DATA
bli
blibli
bli

==> titi.txt <==
bli
blibli
bli

==> titi.txt.bak <==
bla
blablla
#DATA
bli
blibli
bli

==> toto.txt <==
bli
blibli
bli

==> toto.txt.bak <==
bla
blablla
#DATA
bli
blibli
bli

==> tutu.txt <==
bli
blibli
bli

==> tutu.txt.bak <==
bla
blablla
#DATA
bli
blibli
bli

$ 
Merci zipe mais ça ne fonctionne pas mieux : ça me vide intégralement les fichiers qui auraient déjà été corrigés (relance la commande une deuxième fois).

:-S
Messages postés
36299
Date d'inscription
dimanche 7 novembre 2010
Statut
Contributeur
Dernière intervention
27 janvier 2021
6 227
Effectivement ;-\

Je cherche à comprendre mais je ne vois pas pourquoi sed traite les fichiers dont les motifs ne sont pas trouvés ;-((
Messages postés
36299
Date d'inscription
dimanche 7 novembre 2010
Statut
Contributeur
Dernière intervention
27 janvier 2021
6 227
Il semblerait que le fait de demander un motif qui n'existe pas dans une plage commençant à la 1ère ligne serait l'équivalent d'écrire "sed '1,$d' " ;-(((

Bon, pour contourner il suffit de faire une boucle :

$ ls -1
tata.txt
tata.txt.bak
titi.txt
titi.txt.bak
toto.txt
toto.txt.bak
tutu.txt
tutu.txt.bak

$ head *
==> tata.txt <==
bli
blibli
bli

==> tata.txt.bak <==
bla
blablla
#DATA
bli
blibli
bli

==> titi.txt <==
bli
blibli
bli

==> titi.txt.bak <==
bla
blablla
#DATA
bli
blibli
bli

==> toto.txt <==
bli
blibli
bli

==> toto.txt.bak <==
bla
blablla
#DATA
bli
blibli
bli

==> tutu.txt <==
bli
blibli
bli

==> tutu.txt.bak <==
bla
blablla
#DATA
bli
blibli
bli

$ sed -s -i.bak '1{:z;N;/.*\n#DATA/! bz;d}' * 

$ ls -1
tata.txt
tata.txt.bak
tata.txt.bak.bak
titi.txt
titi.txt.bak
titi.txt.bak.bak
toto.txt
toto.txt.bak
toto.txt.bak.bak
tutu.txt
tutu.txt.bak
tutu.txt.bak.bak

$ head *
==> tata.txt <==
bli
blibli
bli

==> tata.txt.bak <==
bli
blibli
bli

==> tata.txt.bak.bak <==
bli
blibli
bli

==> titi.txt <==
bli
blibli
bli

==> titi.txt.bak <==
bli
blibli
bli

==> titi.txt.bak.bak <==
bli
blibli
bli

==> toto.txt <==
bli
blibli
bli

==> toto.txt.bak <==
bli
blibli
bli

==> toto.txt.bak.bak <==
bli
blibli
bli

==> tutu.txt <==
bli
blibli
bli

==> tutu.txt.bak <==
bli
blibli
bli

==> tutu.txt.bak.bak <==
bli
blibli
bli

$
Okay, alors j'ai pas essayé parce qu'entre temps je me suis apperçu que tous les fichiers commençaient par PE en début de première ligne :

Donc un coup de
find "/home/user/donnes/" -maxdepth 1 -name "*.txt" -type f -exec sed -s -i.bak '/^PE*/,/^\#DATA/d' {} \;

fonctionne apparemment pas mal non plus.

(le "find" j'en ai réellement besoin dans mon cas)

;-)
Messages postés
36299
Date d'inscription
dimanche 7 novembre 2010
Statut
Contributeur
Dernière intervention
27 janvier 2021
6 227
(le "find" j'en ai réellement besoin dans mon cas
Pourquoi tu dois faire du récursif ?
je travaille sous Octave.
j'ai besoin d'exécuter des commandes systèmes grace à la fonction "system(la_commande)" ou "la_commande" doit correspondre à ce qu'on entre dans un terminal normalement (à quelques petits détails près au niveau des caractères d'échappement).

j'ai besoin de "find" parce qu'on ne sait pas où on se situe à la base, et que je garde dans une autre variable, la valeur du chemin d'accès créé par l'utilisateur. Et je fais un "find" sur cette variable finalement pour aller chercher "ses" fichiers, et pas d'autres.
Mais à la base je peux être n'importe où dans l'arborescence de l'ordinateur et ça doit marcher quand même ;-)
Messages postés
36299
Date d'inscription
dimanche 7 novembre 2010
Statut
Contributeur
Dernière intervention
27 janvier 2021
6 227
Ok ;-)