web-dev-qa-db-fra.com

Extraire la chaîne des crochets

Je suis assez nouveau à 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 toute autre chaîne à tout autre moment. 

Comment pourrais-je utiliser sed, etc. pour faire cela? Merci!

36
Dang Khoa

Essaye ça: 

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

Voici un moyen 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 une ventilation 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)
48
Daniel Haley

En pure bash:

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

En voici une autre, mais elle 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 séparez sur "]" et parcourez les mots séparés pour trouver un "[", puis sur "[" pour obtenir le premier champ. En python

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

Spécifiez les délimiteurs multiples awk avec -F '[délimiteurs]'

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

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

sinon vous devrez 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}'
7
outdev

Voici un exemple awk, mais je compare les parenthèses, ce qui rend également plus évident le fonctionnement de -F.

echo 'test (lskdjf)' | awk -F '[()]' '{print $ 2}' 

1
Robert Sutton

Un autre awk:

$ echo "string1 [string2] string3 [string4]" |
awk -v RS=[ -v FS=] 'NR>1{print $1}' 
string2
string4
0
dawg

Inline solution pourrait être:

a="first \"Foo1\" and second \"Foo2\""
echo ${a#*\"} | { read b; echo ${b%%\"*}; }

Vous pouvez tester en une seule ligne:

a="first \"Foo1\" and second \"Foo2\""; echo ${a#*\"} | { read b; echo ${b%%\"*}; }

Sortie: Foo1

Exemple entre parenthèses:

a="first [Foo1] and second [Foo2]"
echo ${a#*[} | { read b; echo ${b%%]*}; }

Cela en une ligne:

a="first [Foo1] and second [Foo2]"; echo ${a#*[} | { read b; echo ${b%%]*}; }

Sortie: Foo1

0
Luca Davanzo
Read file in which the delimiter is square brackets:
$ cat file
123;abc[202];124
125;abc[203];124
127;abc[204];124

To print the value present within the brackets:
$ awk -F '[][]' '{print $2}' file
202
203
204

À la première vue, le délimiteur utilisé dans la commande ci-dessus pourrait être déroutant. C'est simple. 2 délimiteurs doivent être utilisés dans ce cas: l'un est [et l'autre]. Comme les délimiteurs eux-mêmes sont des crochets à placer entre crochets, cela semble délicat au premier abord.

Remarque: Si les crochets sont des délimiteurs, vous devez le mettre uniquement de cette manière, c'est-à-dire en premier lieu, suivi de [. Utiliser le délimiteur comme -F '[[]]' donnera une interprétation totalement différente.

Consultez ce lien: http://www.theunixschool.com/2012/07/awk-10-examples-to-read-files-with.html

0
Sudhir Sinha