1 votes

Recadrer une chaîne de caractères en utilisant sed

J'ai une commande qui me sort une liste avec le modèle suivant

exp_70_T8_s1
exp_71_T8_s5
exp_72_T8_s10
exp_73_T10_s1
exp_74_T10_s5
exp_75_T10_s10
...

Comment puis-je obtenir les chiffres après "_T" et "_s" respectivement en utilisant sed ou quelque chose de similaire en bash ?
La sortie devrait ressembler à ceci

8
8
8
10
10
10

et

1
5
10
1
5
10

pour _T y _s respectivement

La première partie de ma commande ressemble à ceci :

for f in $(find . -name "someFile.txt" | sort); do echo $f; done | grep /someFolderName/ 

En gros, je voudrais ajouter la commande à celle donnée ci-dessus.

6voto

heemayl Points 85741

Utilisation de sed avec regroupement de motifs pour capturer les portions souhaitées :

your_command | sed -r 's/.*_T([0-9]+)_s([0-9]+)$/\1 \2/'
  • ([0-9]+) est le premier groupe capturé, [0-9] correspond à tout numéro compris entre 0-9 y + indique une ou plusieurs concordances avec le mot précédent. [0-9] dans ce cas

  • ([0-9]+) est le deuxième groupe capturé

  • Dans le modèle de remplacement, les deux groupes capturés sont référencés par \1 y \2 respectivement.

$ cat file.txt 
exp_70_T8_s1
exp_71_T8_s5
exp_72_T8_s10
exp_73_T10_s1
exp_74_T10_s5
exp_75_T10_s10

$ sed -r 's/.*_T([0-9]+)_s([0-9]+)/\1 \2/' file.txt 
8 1
8 5
8 10
10 1
10 5
10 10

Modifiez le motif de remplacement en fonction de vos besoins, par exemple sans espace :

your_command | sed -r 's/.*_T([0-9]+)_s([0-9]+)/\1\2/' file.txt 

Réponse à la question éditée :

Pour _T :

your_command | grep -Po '.*_T\K\d+'    ## Using grep
your_command | sed -r 's/.*_T([0-9]+).*/\1/'   ## Using sed

Pour _s :

your_command | grep -Po '.*_s\K\d+$'    ## Using grep
your_command | sed -r 's/.*_s([0-9]+)$/\1/'    # Using sed

5voto

ieplugin Points 216

Utilisation de AWK :

command | awk -F_T\|_s '{print $2}'

command |
    awk -F_T\|_s '
        {
            print $2
        }
    '

et :

command | awk -F_T\|_s '{print $3}'

command |
    awk -F_T\|_s '
        {
            print $3
        }
    '

command est la commande qui produit le fichier.

  • -F_T\|_s : sets _T y _s comme séparateurs de champs de saisie ;
  • {print $2} : imprime le 2ème champ.
  • {print $N} : imprime le 3ème champ.

    % cat file exp_70_T8_s1 exp_71_T8_s5 exp_72_T8_s10 exp_73_T10_s1 exp_74_T10_s5 exp_75_T10_s10 % cat file | awk -F_T|_s '{print $2}' 8 8 8 10 10 10 % cat file | awk -F_T|_s '{print $3}' 1 5 10 1 5 10

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X