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 AirplaneBCD
quieres parar en123
. ¿Es porque hay un espacio después de los 3, o algo más?Respuestas:
Si
grep
admite 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
grep
que sabe sobre-o
:El patrón
\<Icecream[^[:blank:]]*
coincide con la cadenaIcecream
(dondeI
está 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
awk
programa divide la cadena en registros separados por espacios y prueba cada uno. Imprimirá los que comienzan con la cadenaIcecream
.Usando
mawk
o GNUawk
, también puede usarya que se
RS
interpretan 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' Icecream123
El
tr
divide la cadena en las líneas mediante la sustitución de todos los espacios con nuevas líneas. Entonces puedes usargrep
fá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' 123
fuente