Simplemente necesito obtener la coincidencia de una expresión regular:
$ cat myfile.txt | SOMETHING_HERE "/(\w).+/"
La salida tiene que ser solo lo que coincide, dentro del paréntesis.
No creo que pueda usar grep porque coincide con la línea completa.
Por favor, hágame saber cómo hacer esto.
sed
luché con referencias para hacer eso?fuente
Si solo desea lo que está entre paréntesis, necesita algo que admita la captura de coincidencias secundarias (Grupos de captura con nombre o numerados). No creo que grep o egrep puedan hacer esto, perl y sed pueden. Por ejemplo, con perl:
Si un archivo llamado foo tiene una línea que es la siguiente:
Y lo hace:
Se devuelve la letra a. Sin embargo, eso podría no ser lo que quieres. Si nos dice qué está tratando de igualar, podría obtener una mejor ayuda. $ 1 es lo que se capturó en el primer conjunto de paréntesis. $ 2 sería el segundo set, etc.
fuente
Debido a que etiquetó su pregunta como bash además de shell , hay otra solución además de grep :
Bash tiene su propio motor de expresión regular desde la versión 3.0, utilizando el
=~
operador, al igual que Perl.ahora, dado el siguiente código:
bash
y no solosh
para obtener todas las extensiones$BASH_REMATCH
dará la cadena completa como coincide con la expresión regular completa, por lo que<Lane>8</Lane>
${BASH_REMATCH[1]}
dará la parte correspondiente al primer grupo, por lo tanto solo8
fuente
>
símbolo para propósitos completamente diferentes) como lo describe el software de alineación de gran escala rápida SANSparallel . Por supuesto, ambos formatos se arrojan entrelazados sin escapar. Por lo tanto, es imposible lanzar alguna biblioteca XML estándar a esto. Y estoy usando Bash regex en este punto del código porque solo necesito extraer un par de datos, y 2 regex hacen el trabajo mucho mejor para mí que escribir un analizador dedicado para este desastre. #LifeInBioinformaticsAsumiendo que el archivo contiene:
Y desea los caracteres entre
>
y</
, puede usar:grep
grep -oP '.*\K(?<=>)\w+(?=<\/)' file
sed
sed -nE 's:^.*>(\w+)</.*$:\1:p' file
awk
awk '{print(gensub("^.*>(\\w+)</.*$","\\1","g"))}' file
perl
perl -nle 'print $1 if />(\w+)<\//' file
Todos imprimirán una cadena "xyz".
Si desea capturar los dígitos de esta línea:
grep
grep -oP '.*\K(?<=>)[0-9]+(?=<\/)' file
sed
sed -E 's:^.*>([0-9]+)</.*$:\1:' file
awk
awk '{print(gensub(".*>([0-9]+)</.*","\\1","g"))}' file
perl
perl -nle 'print $1 if />([0-9]+)<\//' file
fuente
echo 'Text-<here>1234</text>-ends' | sed -E 's|.*>([[:digit:]]+)<.*|\1|'
. En algunos casos (por ejemplo,[0-9]
vs.[[:digit:]]
) no ayudan a la legibilidad, en otros creo que lo hacen (por ejemplo,[ \t\n\r\f\v]
vs.[:space:]
).Esto logrará lo que está solicitando, pero no creo que sea lo que realmente quiere. Puse el
.*
frente de la expresión regular para comer cualquier cosa antes del partido, pero esa es una operación codiciosa, por lo que solo coincide con el penúltimo\w
personaje de la cadena.Tenga en cuenta que necesita escapar de los parens y el
+
.fuente