
A continuación se muestra el contenido del archivo y necesito imprimir solo los números de boleto que están encerrados en "[]". Tengo curiosidad por saber si esto se puede hacer usando los comandos sed y grep.
[request://Problem/26727777] SSO Components (UAT)
[request://Problem/25709048] [SERVER-SETUP] Setup 14xMDN, 10xPRN
[request://Problem/26716590] Logs not populated properly from all servers
[request://Problem/23995808] Prod: Create requestmary
La salida debe ser:
26727777
25709048
26716590
23995808
Lo intenté sed -e 's/[^0-9]//g' ticket | sed '/^$/d'
, pero no puedo obtener el resultado deseado. También incluye otros valores numéricos en la línea y solo necesito obtener el número del ticket:
226829515211
226855182
2268555334
226819615
226781310
226853999
226828948216
Respuesta1
Puedes usar GNU grep
:
$ grep -oP '/\K\d+(?=])' ticket
26727777
25709048
26716590
23995808
O sed
:
sed -E 's#.*/([0-9]*).*#\1#g' ticket
26727777
25709048
26716590
23995808
Ambos elementos anteriores funcionarán en el ejemplo que proporcionó, pero si funcionan en su archivo real dependerá de las otras líneas de su archivo. Imprimen todos los tramos de números que están después de a /
y, para grep
, que están antes de a ]
. Si tiene otras líneas que coinciden con esos criterios, deberá mostrarnos su archivo completo.
Respuesta2
Yo usaría Perl, personalmente.
perl -lne 'print /(\d+)\]/'
Debería funcionar.
-l
para decir "ordenar avances de línea": los elimina automáticamente de la línea y los inserta después de cada uno print
.
-n
dice 'envuelva esto en un while (<>) {
bucle, que itera línea por línea de STDIN (o el archivo) como grep
lo haría.
Y -e
es "expresión" (o "ejecutar", supongo) ejecutar el comando entre comillas. (De lo contrario perl
lea el programa desde STDIN
)
Usamos el hecho de que la coincidencia predeterminada para una expresión regular es en contra $_
(en este contexto, esa es la línea actual).
Debido a que especificamos un grupo de captura, en lugar de devolver "verdadero" o "falso", devuelve una lista (de un solo elemento) de valores capturados:
\d+
es uno o más dígitos. (Es una expresión regular "avanzada", que es aproximadamente similar a [0-9]+
, aunque funciona un poco diferente si usa números no latinos), y necesitamos un ]
después.
Y porque nosotrosnoÚselo g
al final de la expresión regular, solo coincide una vez por línea.
Respuesta3
sed 's/[^0-9]*\([0-9]*\).*/\1/'
Pero si el número de ticket tuviera un ancho fijo, preferiría usarlo cut
.
Editar: con grep:
grep -o '^\[[^0-9]*[0-9]*' | grep -o '[0-9]*'
Respuesta4
tr "\[\]/" " "| awk '/request/ { print $3 }'