ejecución (es) de dígitos
Esta respuesta funciona con cualquier cantidad de grupos de dígitos. Ejemplo:
$ echo 'Num123that456are7899900contained0018166intext' |
> sed -En 's/[^0-9]*([0-9]{1,})[^0-9]*/\1 /gp'
123 456 7899900 0018166
Respuesta expandida.
¿Hay alguna manera de decirle a sed que muestre solo grupos capturados?
Sí.reemplazar todo el texto por el grupo de captura:
$ echo 'Number 123 inside text' | sed 's/[^0-9]*\([0-9]\{1,\}\)[^0-9]*/\1/'
123
s/[^0-9]* # several non-digits
\([0-9]\{1,\}\) # followed by one or more digits
[^0-9]* # and followed by more non-digits.
/\1/ # gets replaced only by the digits.
O con la sintaxis extendida (menos acentos graves y permitir el uso de +):
$ echo 'Number 123 in text' | sed -E 's/[^0-9]*([0-9]+)[^0-9]*/\1/'
123
Para evitar que se imprima el texto original cuando no hay un número, el uso :
$ echo 'Number xxx in text' | sed -En 's/[^0-9]*([0-9]+)[^0-9]*/\1/p'
- (-n) no imprimir la entrada por defecto.
- (/ p) imprima solo si se realizó un reemplazo.
Y para que coincida con varios números (y también imprimirlos):
$ echo 'N 123 in 456 text' | sed -En 's/[^0-9]*([0-9]+)[^0-9]*/\1 /gp'
123 456
que funciona para cualquier recuento de carreras dígitos:
$ str='Test Num(s) 123 456 7899900 contained as0018166df in text'
$ echo "$str" | sed -En 's/[^0-9]*([0-9]{1,})[^0-9]*/\1 /gp'
123 456 7899900 0018166
que es muy similar al comando grep:
$ str='Test Num(s) 123 456 7899900 contained as0018166df in text'
$ echo "$str" | grep -Po '\d+'
123
456
7899900
0018166
Acerca \ d
y el patrón: /([\d]+)/
Sed no reconoce el (acceso directo) sintaxis '\ d'. El equivalente ascii usado anteriormente [0-9]
no es exactamente equivalente. La única solución alternativa es usar una clase de caracteres: '[[: digit:]] `.
La utilización respuesta seleccionada tales "clases de caracteres" para construir una solución:
$ str='This is a sample 123 text and some 987 numbers'
$ echo "$str" | sed -rn 's/[^[:digit:]]*([[:digit:]]+)[^[:digit:]]+([[:digit:]]+)[^[:digit:]]*/\1 \2/p'
Esa solución sólo funciona para (exactamente) dos series de dígitos.
Por supuesto, como la respuesta se está ejecutando dentro de la cáscara, podemos definir un par de variables para realizar dicha respuesta más corto:
$ str='This is a sample 123 text and some 987 numbers'
$ d=[[:digit:]] D=[^[:digit:]]
$ echo "$str" | sed -rn "s/$D*($d+)$D+($d+)$D*/\1 \2/p"
Pero, como ya se ha explicado, mediante un comando s/…/…/gp
es mejor:
$ str='This is 75577 a sam33ple 123 text and some 987 numbers'
$ d=[[:digit:]] D=[^[:digit:]]
$ echo "$str" | sed -rn "s/$D*($d+)$D*/\1 /gp"
75577 33 123 987
Eso cubrirá tanto ejecuciones repetidas de dígitos como la escritura de un comando corto (er).
Como nota, OSX Mountain Lion ya no es compatible con PCRE en grep. – yincrash
Como nota al margen, la opción grep -o no es compatible con Solaris 9. Además, Solaris 9 no es compatible con la opción sed -r. :( – BlackSheep
Pídale a su administrador de sistemas que instale gsed. Se sorprenderá de lo que le darán algunas donas ... – avgvstvs