Si tiene GNU grep, puede usar su -o
opción para buscar una expresión regular y generar solo la parte correspondiente. (Otras implementaciones grep solo pueden mostrar la línea completa). Si hay varias coincidencias en una línea, se imprimen en líneas separadas.
grep -o '\[[0-9]*\]'
Si solo quieres los dígitos y no los corchetes, es un poco más difícil; debe usar una aserción de ancho cero: una expresión regular que coincida con la cadena vacía, pero solo si está precedida o seguida, según sea el caso, por un corchete. Las aserciones de ancho cero solo están disponibles en la sintaxis de Perl.
grep -P -o '(?<=\[)[0-9]*(?=\])'
Con sed, debe desactivar la impresión -n
y hacer coincidir toda la línea y conservar solo la parte correspondiente. Si hay varias coincidencias posibles en una línea, solo se imprime la última coincidencia. Consulte Extracción de una expresión regular combinada con 'sed' sin imprimir los caracteres circundantes para obtener más detalles sobre el uso de sed aquí.
sed -n 's/^.*\(\[[0-9]*\]\).*/\1/p'
o si solo quieres los dígitos y no los corchetes:
sed -n 's/^.*\[\([0-9]*\)\].*/\1/p'
Sin grep -o
, Perl es la herramienta de elección aquí si quieres algo que sea simple y comprensible. En cada línea ( -n
), si la línea contiene una coincidencia para \[[0-9]*\]
, imprima esa coincidencia ( $&
) y una nueva línea ( -l
).
perl -l -ne '/\[[0-9]*\]/ and print $&'
Si solo desea los dígitos, coloque paréntesis en la expresión regular para delimitar un grupo e imprima solo ese grupo.
perl -l -ne '/\[([0-9]*)\]/ and print $1'
PD Si solo desea requerir uno o más dígitos entre los corchetes, cambie [0-9]*
a [0-9][0-9]*
, o a [0-9]+
en Perl.
[number]
" significa excepto[0-9]
perl
afirmaciones de expresiones regulares se ven realmente útiles! He estado leyendo sobre ellos después de verte usar afirmaciones tanto hacia atrás como hacia adelante, incluso en grep (había desactivado el hecho de que puedes elegir un motor de expresiones regulares). A partir de ahora dedicaré un poco más de tiempo a la expresión regular de Perl. Gracias ... PD ... Acabo de leerman grep
... "Esto es muy experimental y grep -P puede advertir sobre características no implementadas". ... espero que eso no signifique inestable (?) ...No puedes hacerlo con
cut
.tr -c -d '0123456789\012'
sed 's/[^0-9]*//g'
awk -F'[^0-9]+' '{ print $1$2$3 }'
grep -o -E '[0-9]+'
tr
es el ajuste más natural para el problema y probablemente se ejecute más rápido, pero creo que necesitaría entradas gigantescas para separar cualquiera de estas opciones en términos de velocidad.fuente
^.*
es codicioso y consume todo menos el último dígito, y+
necesita ser\+
o usar el posix\([0-9][0-9]*\)
... y, en cualquier caso,'s/[^0-9]*//g'
funciona igual de bien,... Thanks for the
ejemplo tr -c`, pero ¿no es ese\012
rastro superfluo?\012
: es necesario, de lo contrariotr
se comerá las nuevas líneas.\0
,1
,2
(o incluso \, 0, 1, 2). Parece que no estoy lo suficientemente en sintonía con el octal. Gracias.Si se refiere a extraer un conjunto de dígitos consecutivos entre caracteres no dígitos, supongo
sed
, yawk
son la mejor (aunquegrep
también es capaz de darle los caracteres coincidentes):sed
: por supuesto, puede hacer coincidir los dígitos, pero quizás sea interesante hacer lo contrario, eliminar los no dígitos (funciona siempre que solo haya un número por línea):grep
: puede coincidir dígitos consecutivosNo doy un ejemplo
awk
porque tengo experiencia nula con él; Es interesante notar que, aunquesed
es un cuchillo suizo,grep
le brinda una forma más simple y legible de hacerlo, que también funciona para más de un número en cada línea de entrada (la-o
única imprime las partes coincidentes de la entrada, cada una) en su propia línea):fuente
sed
eqivalent del "más de un número por línea" ejemplogrep -o '[[:digit:]]*'
. . .sed -nr '/[0-9]/{ s/^[^[0-9]*|[^0-9]*$//g; s/[^0-9]+/\n/g; p}'
... (+1)Como se ha dicho que no se puede hacer esto
cut
, demostraré que es fácilmente posible producir una solución que al menos no sea peor que algunas de las otras, a pesar de que no apruebo el usocut
como "el mejor" (o incluso una solución particularmente buena). Debería decirse que cualquier solución que no busque específicamente*[
y]*
alrededor de los dígitos hace suposiciones simplificadoras y, por lo tanto, es propenso a fallar en los ejemplos más complejos que el dado por el autor de la pregunta (por ejemplo, dígitos fuera*[
y]*
, que no deberían mostrarse). Esta solución verifica al menos los corchetes, y podría extenderse para verificar también los asteriscos (se deja como ejercicio para el lector):Esto hace uso de la
-d
opción, que especifica un delimitador. Obviamente, también puede canalizar lacut
expresión en lugar de leer desde un archivo. Si biencut
es probable que sea bastante rápido, ya que es simple (sin motor regex), debe invocarlo al menos dos veces (o un poco más de tiempo para verificarlo*
), lo que crea una sobrecarga del proceso. La única ventaja real de esta solución es que es bastante legible, especialmente para usuarios ocasionales que no conocen bien las construcciones de expresiones regulares.fuente