Eu tenho uma string, por exemplo
"Icecream123 AirplaneBCD CompanyTL1 ComputerYU1"
Digamos que eu saiba que minha string conterá com certeza a substring IceCream, mas não sei o que segue.
Pode ser 123, como no meu exemplo, ou pode ser algo diferente.
Embora eu possa usar grep para detectar se a substring "Icecream" existe na minha string com o seguinte comando
echo $string | grep -oF 'Icecream';
Qual irá imprimir
Icecream
Eu quero com um comando para fazê-lo imprimir toda a substring, que no meu exemplo é
Icecream123
É claro que o sorvete a seguir é aleatório e desconhecido antes, então não posso fazer
$SUBSTRING=$(echo $string | grep -oF 'Icecream')
$SUBSTRINGTRAIL=123
echo $SUBSTRING$SUBSTRINGTRAIL
bash
shell-script
grep
Sonamor
fonte
fonte
Icecream123 AirplaneBCD
você quer parar às123
. Isso é porque existe um espaço depois do 3, ou algo mais?Respostas:
Se você
grep
suporta expressões regulares compatíveis com perl, você pode corresponder não avidamente ao limite da próxima palavra:Caso contrário, corresponda à sequência mais longa de caracteres não em branco:
Ou mantenha tudo no shell e remova a maior sequência de caracteres à direita, começando com um espaço:
fonte
'Icecream\S+'
para alguns caracteres não em branco.Usando um
grep
que sabe sobre-o
:O padrão
\<Icecream[^[:blank:]]*
corresponde à sequênciaIcecream
(ondeI
é precedida por um caractere que não é palavra ou o início da linha), seguida por zero ou mais espaços em branco (não espaços ou tabulações).Usando
awk
:O
awk
programa divide a sequência em registros separados por espaço e testa cada um. Irá imprimir os que começam com a sequênciaIcecream
.Usando
mawk
ou GNUawk
, você também pode usarpois eles se interpõem
RS
como uma expressão regular se contiver mais de um caractere.Com
sed
, de maneira semelhante agrep
:Usando
/bin/sh
:Perl (com uma pequena ajuda de
tr
):ou apenas
fonte
echo "$string" | grep -o '\S\+' | grep "Icecream"
Desde que você marcou bash:
De maneira mais geral, para um termo de pesquisa em
$search
:... ou com expansão de parâmetro:
fonte
Por exemplo, se você usar
GNU grep
:Ele usa
PCRE
.fonte
Um pouco mais simples, talvez, especialmente porque você diz que sua versão do grep não suporta perl regex:
$ echo $string | tr ' ' '\n' | grep 'Icecream' Icecream123
O
tr
divide a sequência em linhas, substituindo todos os espaços por novas linhas. Então você pode usargrep
facilmente.Você também pode escrever o seguinte para obter apenas o que segue a palavra que você está procurando:
$ echo $string | tr ' ' '\n' | sed -n 's/Icecream//p' 123
fonte