J'ai une chaîne, par exemple
"Icecream123 AirplaneBCD CompanyTL1 ComputerYU1"
Disons que je sais que ma chaîne contiendra à coup sûr la sous-chaîne IceCream mais je ne sais pas ce qui la suit.
Ce pourrait être 123 comme dans mon exemple ou ce pourrait être quelque chose de différent.
Bien que je puisse utiliser grep pour détecter si la sous-chaîne "Icecream" existe dans ma chaîne avec la commande suivante
echo $string | grep -oF 'Icecream';
Qui va imprimer
Icecream
Je veux avec une commande pour l'obtenir pour imprimer la sous-chaîne entière, qui dans mon exemple est
Icecream123
Bien sûr, ce qui suit Icecream est aléatoire et n'est pas connu à l'avance, donc je ne peux pas simplement faire
$SUBSTRING=$(echo $string | grep -oF 'Icecream')
$SUBSTRINGTRAIL=123
echo $SUBSTRING$SUBSTRINGTRAIL
bash
shell-script
grep
Sonamor
la source
la source
Icecream123 AirplaneBCD
vous voulez vous arrêter à123
. Est-ce parce qu'il y a un espace après le 3, ou autre chose?Réponses:
Si votre
grep
prend en charge les expressions régulières compatibles Perl, vous pouvez faire correspondre sans avidité jusqu'à la limite de mot suivante:Sinon, faites correspondre la plus longue séquence de caractères non vides:
Ou gardez tout dans le shell et supprimez la séquence de caractères la plus longue commençant par un espace:
la source
'Icecream\S+'
pour certains caractères non vides.Utiliser un
grep
qui connaît-o
:Le modèle
\<Icecream[^[:blank:]]*
correspond à la chaîneIcecream
(où leI
est précédé d'un caractère autre qu'un mot ou au début de la ligne) suivi de zéro ou plusieurs espaces non (pas d'espaces ni de tabulations).En utilisant
awk
:Le
awk
programme divise la chaîne en enregistrements séparés par des espaces et teste chacun. Il imprimera ceux qui commencent par la chaîneIcecream
.En utilisant
mawk
ou GNUawk
, vous pouvez également utiliserpuisqu'ils interpet
RS
comme expression régulière s'il contient plus d'un caractère.Avec
sed
, de la même manière qu'avecgrep
:En utilisant
/bin/sh
:Perl (avec un peu d'aide de
tr
):ou juste
la source
echo "$string" | grep -o '\S\+' | grep "Icecream"
Depuis que vous avez marqué bash:
Plus généralement, pour un terme de recherche dans
$search
:... ou avec extension des paramètres:
la source
Par exemple, si vous utilisez
GNU grep
:Il utilise
PCRE
.la source
Un peu plus simple peut-être, d'autant plus que vous dites que votre version de grep ne supporte pas perge regex:
$ echo $string | tr ' ' '\n' | grep 'Icecream' Icecream123
Le
tr
divise la chaîne en lignes en remplaçant tous les espaces par des retours à la ligne. Ensuite, vous pouvez utilisergrep
facilement.Vous pouvez également écrire ce qui suit pour obtenir uniquement ce qui suit le mot que vous recherchez:
$ echo $string | tr ' ' '\n' | sed -n 's/Icecream//p' 123
la source