10
votes

Comment utiliser SED pour retourner quelque chose de première ligne qui correspond et cesser de fumer tôt?

J'ai vu de

Comment utiliser SED pour remplacer uniquement la première occurrence dans un fichier? p>

Comment faire la plupart de ce que je veux: P>

sed -n '0,/.*\(something\).*/s//\1/p'

sed

2 commentaires

Pouvez-vous montrer plus de ce que vous obtenez et ce que vous voulez et comment ils diffèrent? J'ai fait Echo -e "AAA 111 AAA \ NBBB 111 BBB" | SED -N '0, /. * \ (111 \). * / S // \ 1 / P' et obtenu un "111". Ensuite, j'ai fait Echo -e "AAA 111 AAA \ NBBB 111 BBB" | SED -N '0, / \ (. * \ (111 \). * \) / S // \ 1 / p' Pour afficher la ligne complète pour vous assurer de savoir ce qu'il s'agissait d'obtenir et de produire «AAA 111 AAA», ce que j'attendais. Notez que je n'utilise pas de q . Comment ça va "ne pas fonctionner" pour vous.


Votre méthode génère la sortie correcte, mais elle continue à traiter le fichier entier, même s'il n'y a plus de travail à faire, ce qui est affreux pour les fichiers géants ou lorsqu'il est utilisé dans un pipeline. Mon étui d'utilisation spécifique était de savoir via 'Git Log' sur un arbre importé GIT-P4 que la branche de perforce a été utilisée pour la dernière commission. Le journal git (quand appelé sans-N se connectera tous les engagements que tout se produisait (des centaines de milliers de mille pour moi). Nous ne pouvons pas connaître a-priori Quelle valeur pour donner Git pour '-n.' ma solution était: Git Log | SED -n '0, /. * [Git-P4:. * \ / \ / dépôt \ / bla \ / ([^ \ /] *) \ /.*/ S / / \ 1 / P; / [ git-p4 / q '


5 Réponses :


1
votes

sed a généralement une option pour spécifier plusieurs motifs à exécuter (IIRC, c'est l'option -e ). De cette façon, vous pouvez spécifier un deuxième modèle qui arrête après la première ligne.

Une autre approche consiste à utiliser sed pour extraire la première ligne ( sed '1q' ), puis tuyau à une seconde commande sed SED (ce que vous affichez ci-dessus).


0 commentaires

1
votes

Utilisez GAWK

gawk '/MATCH/{
            print "do something with "$0
            exit 
}' file


0 commentaires

2
votes

Mon étui d'utilisation spécifique consistait à découvrir via «Git Log» sur un arbre importé GIT-P4 que la branche de perforce a été utilisée pour la dernière commission. Le journal de git (quand appelé sans -n se connectera tous les engagements que tous les arrivaient (des centaines de milliers de mille pour moi)).

Nous ne pouvons pas connaître A-Priori quelle valeur pour donner Git pour '-n.' Après avoir posté cela, j'ai trouvé ma solution qui était: xxx

J'aimerais toujours savoir comment faire cela avec un séparateur non '/' et sans avoir à spécifier La partie "git-p4" deux fois, une fois pour l'extraction et une fois pour le quitte. Il doit y avoir un moyen de combiner à la fois sur la même ligne ...


0 commentaires

10
votes

L'aiguille "Imprimer et quitter" Trick fonctionne, si vous mettez également la commande de substitution dans le bloc (au lieu de ne poser que l'impression et de les arrêter).

Essayez: P>

sed -n '/.*\(something\).*/{s//\1/p;q}'


1 commentaires

Malheureusement, donne une erreur sur MacOS Caractères supplémentaires à la fin de la commande q . La solution est facile: mettre un point-virgule après q: {s // \ 1 / p; q;}



0
votes

à "renvoyer quelque chose de première ligne et quittez" Vous pouvez également utiliser grep : xxx

grep est censé être plus rapide que sed and awk [ 1 ]. Même si non, cette syntaxe est plus facile à retenir (et de taper: grep -m1 'quelque chose' ).

Si vous ne voulez pas voir la ligne entière mais juste La pièce correspondante, le - uniquement-correspondant ( -o ) peut suffire.


0 commentaires