bash regex para localizar e salvar uma string do arquivo

1

Meu arquivo, hi.html , tem muitas linhas de texto. Eu preciso procurar a linha que começa com

Hello abc123 blah blah blah

e, em seguida, salve em myvariable o texto que estiver na posição de abc123 , que mudará de tempos em tempos, mas Hello é codificado e sempre será "Olá". Observe que um espaço delimita os dois lados do texto ocupado pelo todo abc123 importante.

    
por test me now 25.12.2015 / 19:39

2 respostas

3

Primeiro, um aviso obrigatório. Geralmente é uma idéia muito ruim para tentar analisar HTML com ferramentas simples como expressões regulares. Dito isto, neste caso, se você tem certeza de que o que você quer sempre será a segunda palavra em uma linha que começa com Hello , você pode usar um dos seguintes:

  1. GNU grep

    grep -oP '^Hello\s+\K\S+'
    

    Isso é grep com expressões regulares compatíveis com Perl ( -P ) e -o para informar que apenas imprime a parte correspondente da linha. A regex em si procura Hello , depois um ou mais caracteres de espaço em branco ( \s+ ) e, em seguida, descarta-o ( \K ) e, em seguida, 1 ou mais caracteres não brancos ( \S+ ).

  2. awk

    awk '$1=="Hello"{print $2}' file
    

    awk dividirá automaticamente suas linhas de entrada no espaço em branco e o primeiro campo será $1 , o segundo $2 etc. Portanto, esse script imprimirá o segundo campo se o primeiro for Hello . Observe que não corresponderá a Helooo . Se você quiser que todas as linhas cujos primeiros caracteres sejam Hello e não necessariamente somente aquelas cuja primeira palavra seja exatamente Hello , use isso:

    awk '/^Hello/{print $2}' file
    

Com ambas as abordagens, para salvar a saída em uma variável, use substituição de comando :

myvariable=$(grep -oP '^Hello\s+\K\S+')
myvariable=$(awk '/^Hello/{print $2}' file)
    
por 25.12.2015 / 19:51
1

Se o seu grep suportar o PCRE, você pode fazer:

grep -Po '^Hello \K[^ ]+(?= )' hi.html

Para salvá-lo em uma variável:

myvariable="$(grep -Po '^Hello \K[^ ]+(?= )' hi.html)"

Alternar sed caminho:

sed -n 's/^Hello \([^ ]\+\) .*//p' hi.html

Para salvá-lo em myvariable :

myvariable="$(sed -n 's/^Hello \([^ ]\+\) .*//p' hi.html)"

Note que analisar o html usando o Regex pode não ser uma boa ideia.

    
por 25.12.2015 / 19:50