62 votes

Extraire la chaîne des crochets

Je suis assez nouveau chez bash donc c'est une question assez noob..

Supposons que j'ai une chaîne :

 string1 [string2] string3 string4

Je voudrais extraire string2 des crochets ; mais les crochets peuvent entourer n'importe quelle autre chaîne à tout autre moment.

Comment utiliserais-je sed , etc. pour le faire ? Merci!

93voto

jman Points 6799

Essaye ça:

 echo $str | cut -d "[" -f2 | cut -d "]" -f1

73voto

Daniel Haley Points 19098

Voici une façon d'utiliser awk :

 echo "string1 [string2] string3 string4" | awk -F'[][]' '{print $2}'

Cette option sed fonctionne également :

 echo "string1 [string2] string3 string4" | sed 's/.*\[\([^]]*\)\].*/\1/g'

Voici un aperçu de la commande sed :

 s/          <-- this means it should perform a substitution
.*          <-- this means match zero or more characters
\[          <-- this means match a literal [ character
\(          <-- this starts saving the pattern for later use
[^]]*       <-- this means match any character that is not a [ character
                the outer [ and ] signify that this is a character class
                having the ^ character as the first character in the class means "not"
\)          <-- this closes the saving of the pattern match for later use
\]          <-- this means match a literal ] character
.*          <-- this means match zero or more characters
/\1         <-- this means replace everything matched with the first saved pattern
                (the match between "\(" and "\)" )
/g          <-- this means the substitution is global (all occurrences on the line)

21voto

Alex Howansky Points 16820

En pure bash :

 STR="string1 [string2] string3 string4"
STR=${STR#*[}
STR=${STR%]*}
echo $STR

17voto

outdev Points 3053

Spécifiez awk plusieurs délimiteurs avec -F '[delimiters]'

Si les délimiteurs sont des crochets, placez-les dos à dos comme ceci ][

 awk -F '[][]' '{print $2}'

sinon tu devras leur échapper

 awk -F '[\\[\\]]' '{print $2}'

Autres exemples pour obtenir la valeur entre parenthèses :

 echo "string1 (string2) string3" | awk -F '[()]' '{print $2}'
echo "string1 {string2} string3" | awk -F '[{}]' '{print $2}'

16voto

ghostdog74 Points 86060

En voici un autre, mais il prend en charge plusieurs occurrences, par exemple

 $ echo "string1 [string2] string3 [string4 string5]" | awk -vRS="]" -vFS="[" '{print $2}'
string2
string4 string5

La logique simple est la suivante, vous divisez sur "]" et parcourez les mots divisés en trouvant un "[", puis divisez-vous sur "[" pour obtenir le premier champ. En Python

 for item in "string1 [string2] string3 [string4 string5]".split("]"):
    if "[" in item:
       print item.split("]")[-1]

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X