J'ai un fichier test.txt
, qui contient le résultat suivant:
service_name1= Apple/ball/cat/dog/Egg/12.34.56/ball/Apple
service_name2= fan/girl/house/ice/joker/23.45.67/fan/girl
et ainsi de suite jusqu'à service_name1500
Je veux une sortie comme:
Egg 12.34.56
joker 23.45.67
et ainsi de suite: le numéro de version avec le mot précédent.
Cela devrait être un simple travail cut
:
cut -d/ -f5,6 --output-delimiter=" "
-d/
définit le délimiteur d'entrée sur /
-f5,6
renvoie uniquement les 5ème et 6ème champs--output-delimiter=" "
définit le délimiteur de sortie comme un espaceLa même chose avec awk
, awk
définit par défaut le séparateur de champ en sortie comme espace:
awk -F/ '{print $5,$6}'
Exemple:
% cat file.txt
service_name1= Apple/ball/cat/dog/Egg/12.34.56/ball/Apple
service_name2= fan/girl/house/ice/joker/23.45.67/fan/girl
% cut -d/ -f5,6 --output-delimiter=" " file.txt
Egg 12.34.56
joker 23.45.67
% awk -F/ '{print $5,$6}' file.txt
Egg 12.34.56
joker 23.45.67
une solution sed
(fonctionne si la position de champ de la chaîne de version est cohérente ou non, mais la forme de la chaîne de version doit être cohérente)
$ sed -r 's#.*/(.*)/([0-9]{2}\.[0-9]{2}\.[0-9]{2}).*#\1 \2#' test.txt
Egg 12.34.56
joker 23.45.67
-r
utilise ERE pour ne pas avoir à échapper des métacaractères ()
s#old#new#
trouver le modèle old
et remplacer par new
name__.*
correspond à aucun caractère ou aucun dans cette position(stuff)
mémoriser stuff
pour plus tard[0-9]{2}\.[0-9]{2}\.[0-9]{2}
motif de [2 chiffres]. [2 chiffres]. [2 chiffres]\1 \2
les deux modèles mémorisés avec un espace entre euxCela va le faire:
cut -d'/' -f5-6 test.txt | tr -s "/" " "
Si vous travaillez avec des postes Word fixes, cela fonctionnera:
grep -e 'service_name[0-9]*=' test.txt|awk -F'/' '{ print $5" "$6 }'
$sed -r 's/.*\/([[:alpha:]]+)\/([\.0-9]*)\/.*/\1 \2/' test.txt
Explication:
.*
au début et à la fin coupe tous les caractères qui ne correspondent pas aux suivants([[:alpha:]]+)
le premier sous-groupe entre parenthèses ne correspond qu'à des caractères alphabétiques\/
correspond à une barre oblique qui sera découpée([\.0-9]*)
fait correspondre les nombres et les points et les stocke dans le deuxième registre/
vient la substitution avec \1 \2
insère les premier et deuxième registres des sous-groupes correspondantsLongue mais fonctionnelle python one-liner:
$ python -c "import sys;print '\n'.join([ ' '.join(l.strip().split('/')[4:6]) for l in sys.stdin])" < input.txt
Egg 12.34.56
joker 23.45.67
Comment ça marche:
<
dans le flux stdin de python[item for item in sequence]
pour lire ligne par ligne stdin.split()
nous permet de décomposer les lignes en une liste de mots en utilisant /
comme séparateur' '.join()
'\n'.join()
et imprimez le tout