Contribution:
blahŤfoobar1Ťblah
Sortie désirée:
foobar1
Je veux obtenir le texte entre deux "" caractères.
Supposons qu'il y ait toujours 0 ou 2 "" caractères pour faciliter les choses.
J'ai essayé ce qui suit, mais je ne sais pas comment le faire pour savoir de quel événement il s'agit:
echo "blahŤfoobar1Ťblah" | sed -n '/Ť/,/Ť/p'
Vous pouvez utiliser une commande de coupe.
Pour extraire le deuxième motif:
echo "blah@foobar1@blah" | cut -f2 -d"@"
Pour extraire les deuxième et troisième modèles:
echo "blah@foobar1@blah" | cut -f2,3 -d"@"
Extraire à partir du deuxième motif
echo "blah@foobar1@blah" | cut -f2- -d"@"
EDIT: Depuis que la question a été marquée avec awk. Voici une solution awk.
echo "blah@foobar1@blah" | awk -F'@' {'print $2'}
Utiliser sed
echo "blahŤfoobar1Ťblah" | sed -r 's/(^.*Ť)(.*)(Ť.*$)/\2/'
sortie
foobar1
Une autre façon possible d'utiliser sed
echo "blahŤfoobar1Ťblah" | sed -r 's/.*Ť(.*)Ť.*/\1/'
sortie
foobar1
Merci pour @kos pour la note -r
_
awk
aime ces choses:
$ awk -F"Ť" '{print $2}' <<< "blahŤfoobar1Ťblah"
foobar1
En utilisant Ť
comme séparateur de champs, nous nous assurons de saisir le texte souhaité dans le deuxième bloc. Si nous souhaitons ignorer le traitement si aucun Ť
n'est trouvé dans une ligne donnée, nous pourrions utiliser awk -F"Ť" 'NF>1{print $2}'
.
En ce qui concerne votre tentative ne fonctionne pas: en disant sed -n '/start/,/end/p'
vous imprimez les lignes comprises entre (et incluses) une ligne contenant start
et une autre contenant end
. Donc, cela fonctionnerait si vous le vouliez.
Étant donné ce fichier:
$ cat a
starting...
Ť
foobar1
hello
Ť
i am here
La sortie est:
$ sed -n '/Ť/,/Ť/p' a
Ť
foobar1
hello
Ť
awk
semble être le plus facile à utiliser pour résoudre ce problème:
$ echo "blahŤfoobar1Ťblah" | awk -FŤ '{ print $2 }'
foobar1
Vous pouvez également utiliser Perl
pour extraire le texte:
$ echo 'blahŤfoobar1Ťblah' | Perl -FŤ -ane 'print"$F[1]\n"'
foobar1
Ici, la clé consiste à utiliser l'option -F
pour définir le délimiteur.
Une autre approche utilisant une expression régulière:
$ echo "blahŤfoobar1Ťblah" | Perl -pe 's/.*Ť(.*)Ť.*/$1/'
foobar1
Utiliser bash
:
$ test='blahŤfoobar1Ťblah'
$ spamegg="${test#*Ť}"
$ echo "${spamegg%Ť*}"
foobar1
Ici, nous avons utilisé le paramètre de développement bash
pour obtenir la sous-chaîne souhaitée.
"${test#*Ť}"
supprimera la partie blahŤ
, donc la variable spamegg
aura foobar1Ťblah
${spamegg%Ť*}
supprimera le Ťblah
final, ainsi nous obtiendrons le résultat foobar1
Utiliser grep
:
$ echo "blahŤfoobar1Ťblah" | grep -Po '(?<=Ť)[^Ť]+(?=Ť)'
foobar1
-P
implémente la Perl
regex compatible, -o
imprime uniquement la partie correspondante
(?<=Ť)
est l'aspect positif de la largeur zéro derrière le motif, ce qui garantit qu'il y aura un Ť
avant le match.
(?=Ť)
est le motif de lecture positif de largeur zéro garantissant qu'un Ť
suit la correspondance.
[^Ť]+
fera correspondre un ou plusieurs caractères entre les deux Ť
caractères.
Utiliser python
:
$ python2 -c "print 'blahŤfoobar1Ťblah'.split('Ť')[1]"
foobar1
split()
divisera la chaîne en une liste de champs séparés par Ť
et nous avons imprimé le deuxième élément de la liste.