2 votes

Comment séparer plusieurs délimiteurs tout en les gardant entre crochets ?

J'essaie de diviser la chaîne de texte suivante par des tirets, des crochets et des deux-points, mais de les conserver entre crochets.

Entrée :

10:100 - [10/09/21:12:23:22] 

Résultat souhaité :

100, 10/09/21:12:23:22

Mon code actuel :

awk -F '[- ":]' '{print $1, $2, $3, $4, $5}'

2voto

RavinderSingh13 Points 29608

1ère solution : Avec GNU awk vous pouvez essayer le code suivant.

awk '
match($0,/:([^[:space:]]+)[[:space:]]+-[[:space:]]+\[([^]]*)\]/,arr){
   print arr[1],arr[2]
}
' Input_file

2ème solution : Utilisation sed 's s (opération de substitution) avec sa capacité de groupe de capture, essayez ce qui suit :

sed -E 's/^[^:]*:([^[:space:]]+)[[:space:]]+-[[:space:]]+\[([^]]*)\]/\1 \2/'  Input_file

3ème solution : En utilisant n'importe quel awk vous pouvez utiliser le code suivant. En utilisant son sub y gsub sur le premier et le dernier champ.

awk '{sub(/.*:/,"",$1);gsub(/^\[|\]$/,"",$NF);print $1,$NF}' Input_file

4ème solution : Avec la solution en une ligne de Perl qui utilise une correspondance paresseuse .*? on peut essayer de suivre en utilisant son opération de substitution.

perl -pe 's/^.*?:([^[:space:]]+)[[:space:]]+-[[:space:]]+\[([^]]*)\]/\1 \2/'  Input_file

1voto

The fourth bird Points 40138

Si vous avez plusieurs de ces motifs dans la chaîne et que vous ne vous souciez pas de l'ordre, vous pouvez utiliser la fonction awk pour faire correspondre les motifs qui vous intéressent, puis supprimer les délimiteurs qui les entourent.

Dans ce cas, vous pouvez faire correspondre

\[[^][]+]|:[0-9]+

Le modèle correspond :

  • \[[^][]+] Match de [...]
  • | Ou
  • :[0-9]+ Correspondance : et 1+ chiffres

La partie en gsub [:\[]|\]$ correspond soit à : [ au début de la chaîne, ou correspondre à ] à la fin de la chaîne, et la remplacera par une chaîne vide.

awk '
{
  while(match($0,/\[[^][]+]|:[0-9]+/)){
    v = substr($0,RSTART,RLENGTH)
    gsub(/^[:\[]|\]$/, "", v)
    print v
    $0=substr($0,RSTART+RLENGTH)
  }
}
' file

Sortie

100
10/09/21:12:23:22

0voto

En supposant qu'il n'y a pas de lignes vides dans les données d'entrée :

echo '10:100 - [10/09/21:12:23:22]' | 
   nawk 'sub("^[^:]*:",_, $!--NF)' FS='[ -]*[][]' OFS=', '
or
   gawk 'NF -= sub("^[^:]*:",_)' FS='[ -]*[][]' OFS=', '
or 
   mawk 'NF -= sub("^[^:]*:",_)' FS='[][ -]+' OFS=', '
100, 10/09/21:12:23:22

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X