J'ai simplement besoin d'obtenir le match à partir d'une expression régulière:
$ cat myfile.txt | SOMETHING_HERE "/(\w).+/"
La sortie doit être uniquement celle qui a été mise en correspondance, entre parenthèses.
Ne pensez pas que je peux utiliser grep car il correspond à toute la ligne.
S'il vous plait, faites moi savoir comment faire ça.
sed
références pour faire ça?la source
Si vous ne voulez que ce qui est entre parenthèses, vous avez besoin de quelque chose qui prend en charge la capture de sous-correspondances (groupes de capture nommés ou numérotés). Je ne pense pas que grep ou egrep peuvent faire cela, perl et sed le peuvent. Par exemple, avec perl:
Si un fichier appelé foo a une ligne qui est comme suit:
Et vous faites:
La lettre a est retournée. Ce n'est peut-être pas ce que vous voulez. Si vous nous dites ce que vous essayez de faire correspondre, vous obtiendrez peut-être une meilleure aide. $ 1 est tout ce qui a été capturé dans le premier jeu de parenthèses. 2 $ serait le deuxième set, etc.
la source
Parce que vous avez marqué votre question comme bash en plus du shell , il existe une autre solution à côté de grep :
Bash possède son propre moteur d'expression régulière depuis la version 3.0, utilisant l'
=~
opérateur, tout comme Perl.maintenant, étant donné le code suivant:
bash
et pas seulementsh
afin d'obtenir toutes les extensions$BASH_REMATCH
donnera la chaîne entière comme correspond à l'expression régulière entière, donc<Lane>8</Lane>
${BASH_REMATCH[1]}
donnera la partie correspondant au 1er groupe, donc seulement8
la source
>
symbole à des fins entièrement différentes) tel que répandu par le logiciel d'alignement rapide à grande échelle SANSparallel. Bien sûr, les deux formats sont entrelacés sans échappatoire. Il est donc impossible de jeter une bibliothèque XML standard à cela. Et j'utilise Bash regex à ce stade du code car je n'ai besoin d'extraire que quelques données, et 2 regex font le travail beaucoup mieux pour moi que d'écrire un analyseur dédié pour ce gâchis. #LifeInBioinformaticsEn supposant que le fichier contient:
Et vous voulez le (s) caractère (s) entre
>
et</
, vous pouvez utiliser soit:grep
grep -oP '.*\K(?<=>)\w+(?=<\/)' file
sed
sed -nE 's:^.*>(\w+)</.*$:\1:p' file
awk
awk '{print(gensub("^.*>(\\w+)</.*$","\\1","g"))}' file
perl
perl -nle 'print $1 if />(\w+)<\//' file
Tous afficheront une chaîne "xyz".
Si vous souhaitez capturer les chiffres de cette ligne:
grep
grep -oP '.*\K(?<=>)[0-9]+(?=<\/)' file
sed
sed -E 's:^.*>([0-9]+)</.*$:\1:' file
awk
awk '{print(gensub(".*>([0-9]+)</.*","\\1","g"))}' file
perl
perl -nle 'print $1 if />([0-9]+)<\//' file
la source
echo 'Text-<here>1234</text>-ends' | sed -E 's|.*>([[:digit:]]+)<.*|\1|'
. Dans certains cas (par exemple[0-9]
vs[[:digit:]]
), ils ne contribuent pas à la lisibilité, dans d'autres, je pense qu'ils le font (par exemple[ \t\n\r\f\v]
vs[:space:]
).Cela accomplira ce que vous demandez, mais je ne pense pas que ce soit ce que vous voulez vraiment. J'ai mis le
.*
devant de l'expression régulière pour manger n'importe quoi avant le match, mais c'est une opération gourmande, donc cela ne correspond qu'à l'avant-dernier\w
caractère de la chaîne.Notez que vous devez échapper aux parens et aux
+
.la source