Ajuda para construir esta expressão usando sed

2

Eu tenho um arquivo de texto e preciso me livrar de toda a informação logo antes do símbolo = em cada linha, por exemplo:

A linha:

File 1515 = foo.txt

precisa ser assim:

=foo.txt

Então, eu tive essa linha usando sed :

sed s/=[^=]*^// everyone.pls

mas apaga todos os caracteres após o símbolo =.

Então, minha pergunta é: como posso excluir os caracteres antes de = ?

Não se esqueça de que não quero excluir o símbolo = , preciso antes disso.

    
por user219416 24.03.2014 / 06:15

6 respostas

5

Para excluir tudo antes do primeiro sinal de igual :

sed 's/^[^=]*=/=/' everyone.pls

Se o arquivo everyone.pls se parece com:

$ cat everyone.pls
File 1515 = foo.txt
File 1516 = foo=.xls

O comando acima produz:

$ sed 's/^[^=]*=/=/' everyone.pls
= foo.txt
= foo=.xls

No regex ^[^=]*=/ , o acento circunflexo significa que o regex tem que corresponder começando no início da linha. A expressão [^=]*= corresponde a todos os caracteres e incluindo o primeiro sinal de igual. Porque queremos o sinal de igual na saída, precisamos substituir por tudo isso um sinal de igual.

    
por John1024 24.03.2014 / 06:46
3

Você pode usar

sed 's/.*=/=/g' everyone.pls

para remover os caracteres antes de

    
por devav2 24.03.2014 / 06:44
1
sed 's/.*= */=/' YourFile

na sua amostra, há espaço após = que você remove também, apenas 'adapte' outra resposta que não a leve em consideração, mas o que você perguntar (até = ).

    
por NeronLeVelu 24.03.2014 / 10:19
1

Aqui estão algumas outras opções, todas elas serão excluídas até o primeiro = .

  1. Perl

    perl -pe 's/.+?=/=/' everyone.pls
    

    A opção -p significa "imprimir todas as linhas" depois de aplicar o script passado com -e . s/pattern/replacement/ é o operador de substituição e o meio de regex corresponde a qualquer caractere até o primeiro = : . significa qualquer caractere e + significa um ou mais e ? torna a correspondência não-gulosa, parará na menor string correspondente.

  2. awk

    awk -F= '{="=";print;}' everyone.pls 
    

    awk é uma linguagem de script que divide automaticamente sua entrada em campos e disponibiliza os campos como ,...$N . O -F= define o separador de campo como = e ="=" irá, portanto, substituir o conteúdo da linha antes do primeiro sinal de igual por um = e imprimir o restante.

  3. grep

    grep -o '=.*' everyone.pls 
    

    O -o causa grep somente imprime a parte correspondente da linha. Então, procuramos o primeiro = até o final da linha.

  4. bash

    while read line; do echo "=${line#*=}"; done < everyone.pls
    

    Isso está usando um loop while para ler cada linha, salvando-a na variável $line e, em seguida, usando os recursos de manipulação de string do bash para modificá-la. A construção ${variable#pattern} removerá a correspondência mais curta de pattern do final de $variable .

  5. Desnecessariamente complexo

    cut -d= -f 2- everyone.pls | sed 's/^/=/'  
    

    cut também funciona em campos, -d= reduz em = , -f 2- faz com que imprima tudo do 2º campo ao final da linha e o comando sed substitution adiciona = .

por terdon 24.03.2014 / 07:21
0

Você pode ver o problema ao contrário e tentar corresponder à parte que deseja manter:

sed 's:.*\(=.*$\)::' everyone.pls

i.e. combinar tudo, mas cercar a parte que você está interessado em colchetes, em seguida, você adiciona o primeiro grupo de volta com

    
por user261814 25.03.2014 / 07:06
0

Quase certo - apenas ordenou suas expressões para trás. O que você quer fazer é substituir todos os caracteres que não são = pelo primeiro caractere que é = e quaisquer espaços com um único caractere = .

Assim:

sed 's/[^=]*= */=/'

Sua expressão substitui todos os caracteres incluindo e seguindo o primeiro caractere = em uma linha com = .

E não importa a âncora inicial ^ à esquerda -; sed lê a entrada da esquerda para a direita e, portanto, se ler uma linha de entrada inteira correspondente a 0 = caracteres, ela não fará nada, mas para todos os outros só aplicará sua regra à linha mais à esquerda = oa .

    
por mikeserv 07.07.2016 / 17:59