web-dev-qa-db-fra.com

Comment puis-je extraire du texte entre une paire du même caractère?

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'
2
TuxForLife

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'}
8
rahul

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 _

2
Maythux

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.

Exemple

Étant donné ce fichier:

$ cat a
starting...
Ť
foobar1
hello
Ť
i am here

La sortie est:

$ sed -n '/Ť/,/Ť/p' a
Ť
foobar1
hello
Ť
2
fedorqui

awk semble être le plus facile à utiliser pour résoudre ce problème:

$ echo "blahŤfoobar1Ťblah" | awk -FŤ '{ print $2 }'
foobar1
2
boardrider

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
1
Sylvain Pineau
  1. 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

  2. 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.

  3. 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.
1
heemayl