ho visto dallaCome usare sed per restituire qualcosa dalla prima riga che corrisponde e chiude in anticipo?
How to use sed to replace only the first occurrence in a file?
Come fare la maggior parte di ciò che voglio:
sed -n '0,/.*\(something\).*/s//\1/p'
questo trova la prima partita di qualcosa ed estratti (ovviamente il mio vero esempio è più complicato) . So che sed ha un comando di 'smettere' che lo farà smettere presto, ma non so come combinare la 'q' con la linea sopra per ottenere il mio comportamento desiderato.
Ho provato a sostituire la 'p' con {p; q;} come ho visto in alcuni esempi, ma chiaramente non funziona.
Puoi mostrare più di quello che stai ricevendo e cosa vuoi e in che modo differiscono? Ho fatto "echo -e" aaa 111 aaa \ nbbb 111 bbb "| sed -n '0, /. * \ (111 \). */S // \ 1/p'' e ne ho ottenuto uno" 111 ". Poi ho fatto "echo -e" aaa 111 aaa \ nbbb 111 bbb "| sed -n '0,/\ (. * \ (111 \). * \)/S // \ 1/p'' per mostrare il linea completa per assicurarsi quello che stava ottenendo e ha prodotto "aaa 111 aaa" che è quello che mi aspettavo. Si noti che non sto usando un 'q'. Com'è che "non funziona" per te. –
Il metodo genera l'output corretto, ma continua a elaborare l'intero file anche se non c'è più lavoro da fare, il che è terribile per i file giganti o quando viene utilizzato in una pipeline.Il mio caso d'uso specifico era di scoprire tramite 'git log' su un albero importato git-p4 che era stato usato per l'ultimo commit. git log (quando chiamato senza -n registrerà ogni commit che è accaduto (centinaia di migliaia per me). Non possiamo sapere a priori quale valore dare git per '-n.' La mia soluzione era: log git | sed -n '0, /. * \ [git-p4:. * \/\/depot \/blah \/\ ([^ \ /] * \) \ /.*/ s // \ 1/p;/\ [git-p4/q ' – nosatalian