Tengo una cuerda, por ejemplo
"Icecream123 AirplaneBCD CompanyTL1 ComputerYU1"
Digamos que sé que mi cadena contendrá con seguridad la subcadena IceCream, pero no sé qué le sigue.
Puede ser 123 como en mi ejemplo o puede ser algo diferente.
Si bien puedo usar grep para detectar si la subcadena "Icecream" existe en mi cadena con el siguiente comando
echo $string | grep -oF 'Icecream';
Que imprimirá
Icecream
Quiero con un comando que imprima toda la subcadena, que en mi ejemplo es
Icecream123
Por supuesto, lo que sigue a Icecream es aleatorio y no se conoce de antemano, así que no puedo hacer
$SUBSTRING=$(echo $string | grep -oF 'Icecream')
$SUBSTRINGTRAIL=123
echo $SUBSTRING$SUBSTRINGTRAIL
bash
shell-script
grep
Sonamor
fuente
fuente

Icecream123 AirplaneBCDquieres parar en123. ¿Es porque hay un espacio después de los 3, o algo más?Respuestas:
Si
grepadmite expresiones regulares compatibles con Perl, puede hacer coincidir de forma no codiciosa hasta el siguiente límite de palabra:De lo contrario, haga coincidir la secuencia más larga de caracteres no en blanco:
O mantenga todo en el shell y elimine la secuencia de caracteres más larga que comienza con un espacio:
fuente
'Icecream\S+'para algunos caracteres no en blanco.Usando un
grepque sabe sobre-o:El patrón
\<Icecream[^[:blank:]]*coincide con la cadenaIcecream(dondeIestá precedido por un carácter que no es de palabra, o el comienzo de la línea) seguido de cero o más espacios en blanco (no espacios o tabulaciones).Utilizando
awk:El
awkprograma divide la cadena en registros separados por espacios y prueba cada uno. Imprimirá los que comienzan con la cadenaIcecream.Usando
mawko GNUawk, también puede usarya que se
RSinterpretan como una expresión regular si contiene más de un carácter.Con
sed, de manera similar a como congrep:Utilizando
/bin/sh:Perl (con un poco de ayuda de
tr):o solo
fuente
echo "$string" | grep -o '\S\+' | grep "Icecream"Desde que etiquetaste bash:
Más generalmente, para un término de búsqueda en
$search:... o con expansión de parámetros:
fuente
Por ejemplo, si usa
GNU grep:Lo usa
PCRE.fuente
Quizás sea un poco más simple, especialmente porque dice que su versión de grep no es compatible con perl regex:
$ echo $string | tr ' ' '\n' | grep 'Icecream' Icecream123El
trdivide la cadena en las líneas mediante la sustitución de todos los espacios con nuevas líneas. Entonces puedes usargrepfácilmente.También puede escribir lo siguiente para obtener solo lo que sigue a la palabra que está buscando:
$ echo $string | tr ' ' '\n' | sed -n 's/Icecream//p' 123fuente