¿Hay alguna forma de decirle sed
que solo genere grupos capturados? Por ejemplo, dada la entrada:
This is a sample 123 text and some 987 numbers
y patrón:
/([\d]+)/
¿Podría obtener solo 123 y 987 de salida en el formato formateado por referencias anteriores?
sed
activar expresiones regulares extendidas con la-E
bandera.Respuestas:
La clave para que esto funcione es indicar
sed
que excluya lo que no desea que se genere, así como especificar lo que desea.Esto dice:
-n
)p
)En general, en los
sed
grupos de captura con paréntesis y salida de lo que captura con una referencia inversa:dará salida a "bar". Si usa
-r
(-E
para OS X) para expresiones regulares extendidas, no necesita escapar de los paréntesis:Puede haber hasta 9 grupos de captura y sus referencias posteriores. Las referencias posteriores están numeradas en el orden en que aparecen los grupos, pero pueden usarse en cualquier orden y pueden repetirse:
salidas "una barra a".
Si tiene GNU
grep
(también puede funcionar en BSD, incluido OS X):o variaciones como:
La
-P
opción habilita las expresiones regulares compatibles con Perl. Verman 3 pcrepattern
oman 3 pcresyntax
.fuente
sed
ejemplo, si usas la-r
opción (o-E
para OS X, IIRC) no necesitas escapar de los paréntesis. La diferencia es que entre las expresiones regulares básicas y las expresiones regulares extendidas (-r
).Sed tiene hasta nueve patrones recordados, pero debe usar paréntesis escapados para recordar partes de la expresión regular.
Vea aquí para ejemplos y más detalles
fuente
sed -e 's/version=\(.+\)/\1/' input.txt
Esto le sigue la salida del conjunto entrada.txt\+
lugar de+
. Y no entiendo por qué la gente usa-e
solo un comando sed.sed -e -n 's/version=\(.+\)/\1/p' input.txt
see: mikeplate.com/2012/05/09/…sed -E
para usar las llamadas expresiones regulares "modernas" o "extendidas" que se parecen mucho más a Perl / Java / JavaScript / Go / cualquier tipo de sabor. (Compare congrep -E
oegrep
.) La sintaxis predeterminada tiene esas extrañas reglas de escape y se considera "obsoleta". Para obtener más información sobre las diferencias entre los dos, ejecuteman 7 re_format
.puedes usar grep
fuente
o
opción está ahí: unixhelp.ed.ac.uk/CGI/man-cgi?grep : -o, --only-matching Muestra solo la parte de una línea coincidente que coincide con PATTERNgrep -Eow -e "[0-9]+" -e "[abc]{2,3}"
no sé cómo podría requerir que esas dos expresiones estén en una línea aparte de las tuberías de un grep anterior (que aún no podría funcionar si cualquiera de los patrones coincide más de una vez en una línea )corrida (s) de dígitos
Esta respuesta funciona con cualquier recuento de grupos de dígitos. Ejemplo:
Respuesta ampliada
Si. reemplazar todo el texto por el grupo de captura:
O con sintaxis extendida (menos comillas inversas y permite el uso de +):
Para evitar imprimir el texto original cuando no hay un número, use:
Y para hacer coincidir varios números (y también imprimirlos):
Eso funciona para cualquier recuento de ejecuciones de dígitos:
Lo cual es muy similar al comando grep:
Sobre \ d
Sed no reconoce la sintaxis '\ d' (acceso directo). El equivalente ascii utilizado anteriormente
[0-9]
no es exactamente equivalente. La única solución alternativa es usar una clase de caracteres: '[[: dígito:]] `.La respuesta seleccionada usa tales "clases de caracteres" para construir una solución:
Esa solución solo funciona para (exactamente) dos corridas de dígitos.
Por supuesto, a medida que la respuesta se ejecuta dentro del shell, podemos definir un par de variables para acortar dicha respuesta:
Pero, como ya se explicó, utilizar un
s/…/…/gp
comando es mejor:Eso cubrirá tanto las repeticiones de dígitos como la escritura de un comando corto (er).
fuente
Creo que el patrón dado en la pregunta fue solo a modo de ejemplo, y el objetivo era hacer coincidir cualquier patrón.
Si tiene un sed con la extensión GNU que permite la inserción de una nueva línea en el espacio del patrón, una sugerencia es:
Estos ejemplos son con tcsh (sí, sé que es el shell incorrecto) con CYGWIN. (Editar: Para bash, elimine el conjunto y los espacios alrededor =.)
fuente
+
, necesitarías escapar de él o usar la-r
opción (-E
para OS X). También puede usar\{1,\}
(-r
o-E
sin el escape).Renunciar y usar Perl
Como
sed
no lo corta, simplemente tiremos la toalla y usemos Perl, al menos es LSB, mientras que lasgrep
extensiones GNU no son :-)Imprima toda la parte coincidente, no se necesitan grupos coincidentes ni mirar hacia atrás:
Salida:
Coincidencia única por línea, a menudo campos de datos estructurados:
Salida:
Con mirar atrás:
Múltiples campos:
Salida:
Múltiples coincidencias por línea, a menudo datos no estructurados:
Salida:
Con mirar atrás:
Salida:
fuente
Tratar
Tengo esto bajo Cygwin:
fuente
No es lo que solicitó el OP (capturar grupos) pero puede extraer los números usando:
Da lo siguiente:
fuente