Como posso extrair texto entre um par do mesmo caractere?

2

Entrada:

blahŤfoobar1Ťblah

Saída desejada:

foobar1

Eu quero colocar o texto entre dois caracteres "Ť".

Suponha que sempre haverá 0 ou 2 caracteres "Ť" para facilitar as coisas.

Eu tentei o seguinte, mas não sei como saber qual é a ocorrência:

echo "blahŤfoobar1Ťblah" | sed -n '/Ť/,/Ť/p'
    
por TuxForLife 20.05.2015 / 05:15

6 respostas

8

Você pode usar um comando de corte.

Para extrair o segundo padrão:

echo "blah@foobar1@blah" | cut -f2 -d"@"

Para extrair o segundo e terceiro padrões:

echo "blah@foobar1@blah" | cut -f2,3 -d"@"

Para extrair do segundo padrão em diante

echo "blah@foobar1@blah" | cut -f2- -d"@"

EDIT: Como a questão foi marcada com o awk. Aqui está uma solução para o awk.

echo "blah@foobar1@blah" | awk -F'@' {'print '}
    
por rahul 20.05.2015 / 05:23
2

awk parece ser o mais fácil de usar para esse problema:

$ echo "blahŤfoobar1Ťblah" | awk -FŤ '{ print  }'
foobar1
    
por boardrider 20.05.2015 / 15:23
2

awk gosta dessas coisas:

$ awk -F"Ť" '{print }' <<< "blahŤfoobar1Ťblah"
foobar1

Usando Ť como separador de campo, nos certificamos de pegar o texto desejado no segundo bloco. Se quisermos ignorar o processamento se nenhum Ť for encontrado em uma determinada linha, poderíamos usar awk -F"Ť" 'NF>1{print }' .

Em relação à sua tentativa não funcionar: dizendo sed -n '/start/,/end/p' , você está imprimindo as linhas que estão entre (e incluídas) uma linha contendo start e outra contendo end . Então, funcionaria se você quisesse isso.

Exemplo

Dado este arquivo:

$ cat a
starting...
Ť
foobar1
hello
Ť
i am here

A saída é:

$ sed -n '/Ť/,/Ť/p' a
Ť
foobar1
hello
Ť
    
por fedorqui 20.05.2015 / 10:15
2

Usando sed

echo "blahŤfoobar1Ťblah" | sed  -r 's/(^.*Ť)(.*)(Ť.*$)//'

saída

foobar1

Outra maneira possível de usar sed

echo "blahŤfoobar1Ťblah" | sed -r 's/.*Ť(.*)Ť.*//' 

saída

foobar1

Obrigado pelo @kos pela -r note

    
por Maythux 20.05.2015 / 08:19
1

Você também pode usar perl para extrair o texto:

$ echo 'blahŤfoobar1Ťblah' | perl -FŤ -ane 'print"$F[1]\n"'
foobar1

Aqui, a chave é usar a opção -F para definir o delimitador.

Outra abordagem usando uma expressão regular:

$ echo "blahŤfoobar1Ťblah" | perl -pe 's/.*Ť(.*)Ť.*//' 
foobar1
    
por Sylvain Pineau 20.05.2015 / 11:32
1
  1. Usando bash :

    $ test='blahŤfoobar1Ťblah'
    $ spamegg="${test#*Ť}"
    $ echo "${spamegg%Ť*}"
    foobar1
    

    Aqui, usamos a expansão do parâmetro bash para obter a subcadeia desejada.

    • "${test#*Ť}" removerá a parte blahŤ , então a variável spamegg terá foobar1Ťblah

    • ${spamegg%Ť*} removerá o Ťblah , portanto obteríamos a saída foobar1

  2. Usando grep :

        $ echo "blahŤfoobar1Ťblah" | grep -Po '(?<=Ť)[^Ť]+(?=Ť)'
        foobar1
    
    • -P implementa o perl compatível Regex, -o imprime apenas a parte correspondente

    • (?<=Ť) é a largura zero positiva por trás do padrão, garantindo que haverá Ť antes da correspondência

    • (?=Ť) é o padrão lookahead positivo de largura zero, garantindo que haja um Ť após a correspondência

    • [^Ť]+ corresponderá a um ou mais caracteres entre os dois caracteres Ť .

  3. Usando python :

    $ python2 -c "print 'blahŤfoobar1Ťblah'.split('Ť')[1]"
    foobar1
    
    • split() dividirá a string em uma lista de campos separados por Ť e nós imprimimos o segundo elemento da lista.
por heemayl 20.05.2015 / 11:37