vi desde¿Cómo se usa sed para devolver algo de la primera línea que coincida y salga temprano?
How to use sed to replace only the first occurrence in a file?
Cómo hacer la mayor parte de lo que quiero:
sed -n '0,/.*\(something\).*/s//\1/p'
Esto encuentra el primer partido de algo y lo extrae (por supuesto, mi ejemplo real es más complicado) . Sé que sed tiene un comando 'quit' que lo hará detenerse temprano, pero no sé cómo combinar la 'q' con la línea anterior para obtener mi comportamiento deseado.
He intentado reemplazar la 'p' con {p; q;} como he visto en algunos ejemplos, pero eso claramente no está funcionando.
¿Puede mostrar más de lo que está recibiendo y lo que quiere y cómo se diferencian? Hice 'echo -e" aaa 111 aaa \ nbbb 111 bbb "| sed -n '0, /. * \ (111 \). */S // \ 1/p'' y obtuve uno" 111 ". Entonces hice 'echo -e" aaa 111 aaa \ nbbb 111 bbb "| sed -n '0,/\ (. * \ (111 \). * \)/S // \ 1/p'' para mostrar el línea completa para asegurarse de lo que estaba obteniendo y la salida "aaa 111 aaa" que es lo que esperaba. Tenga en cuenta que no estoy usando 'q'. ¿Cómo "no funciona" para ti? –
Su método genera la salida correcta, pero continúa procesando todo el archivo aunque no haya más trabajo por hacer, lo que es horrible para archivos gigantes o cuando se usa en una canalización.Mi caso de uso específico fue averiguar a través de 'git log' en un árbol importado de git-p4 cuya rama obligatoria se usó para la última confirmación. git log (cuando se llama sin -n registrará cada confirmación que sucedió (cientos de miles para mí). No podemos saber a priori qué valor dar a git por '-n'. Mi solución fue: git log | sed -n '0, /. * \ [git-p4:. * \/\/depot \/blah \/\ ([^ \ /] * \) \ /.*/ s // \ 1/p;/\ [git-p4/q ' – nosatalian