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!
Essaye ça:
echo $str | cut -d "[" -f2 | cut -d "]" -f1
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)
En pure bash:
STR="string1 [string2] string3 string4"
STR=${STR#*[}
STR=${STR%]*}
echo $STR
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]
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}'
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}'
Un autre awk
:
$ echo "string1 [string2] string3 [string4]" |
awk -v RS=[ -v FS=] 'NR>1{print $1}'
string2
string4
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
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