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'
5 Réponses :
sed a généralement une option pour spécifier plusieurs motifs à exécuter (IIRC, c'est l'option Une autre approche consiste à utiliser -e code>). De cette façon, vous pouvez spécifier un deuxième modèle qui arrête après la première ligne. P>
sed code> pour extraire la première ligne (
sed '1q' code>), puis tuyau à une seconde commande code> sed code> SED (ce que vous affichez ci-dessus). P>
Utilisez GAWK
gawk '/MATCH/{ print "do something with "$0 exit }' file
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: p> 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 ... p> p>
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}'
Malheureusement, donne une erreur sur MacOS Caractères supplémentaires à la fin de la commande q code>. La solution est facile: mettre un point-virgule après q:
{s // \ 1 / p; q;} code>
à "renvoyer quelque chose de première ligne et quittez" Vous pouvez également utiliser Si vous ne voulez pas voir la ligne entière mais juste La pièce correspondante, le grep code>:
grep code> 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'
- uniquement-correspondant code> (
-o code>) peut suffire. p> p>
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' code> et obtenu un "111". Ensuite, j'ai fait
Echo -e "AAA 111 AAA \ NBBB 111 BBB" | SED -N '0, / \ (. * \ (111 \). * \) / S // \ 1 / p' CODE> 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 code>. 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 '