Usando sed para remover dígitos e espaço em branco de uma string

6

Estou tentando remover a primeira ocorrência de dígito (s), o ponto, a segunda ocorrência de dígito (s) e o espaço antes da palavra .

Eu criei este regex:

sed 's/^[0-9]\+.[0-9]\+\s//' input.txt > output.txt

Exemplo de texto:

2.14 Italien
2.15 Japonais

Meu regex não funciona infelizmente. Há um problema com o \s , mas não consigo identificar o que é ...

Alguém pode ajudar?

edit : O problema é que preciso remover o primeiro espaço apenas porque algum texto contém espaços, como você pode ver abaixo:

3.15 Chichewa
3.16 Chimane
3.17 Cinghalais
3.18 Créole de Guinée-Bissau
    
por balteo 31.03.2013 / 20:32

5 respostas

12

O comando que você está usando deve funcionar como está com o GNU sed . Mas com o BSD sed , que por exemplo vem com o OS X, não será.

  • Se você está tentando usar Expressões regulares estendidas - que suportam o + metacaractere - você precisa explicitamente habilitá-los. Para BSD sed , faça isso com sed -E e para GNU sed com sed -r .

    O \+ sozinho faz com o GNU sed quando os EREs não estão ativados, mas isso é menos portável.

  • Você está usando o Perl-like \s , que não existe para Expressões regulares básicas e estendidas. O sed normal não suporta expressões regulares Perl. O GNU sed suporta o \s - mas seria mais portável simplesmente adicionar o espaço à sua expressão regular.

  • Por fim, seu . corresponde a um caractere, portanto, seu regex corresponderia a qualquer caractere daquele lugar, não apenas um ponto. Use \. para escapar corretamente.

Então, uma solução seria, para o GNU sed :

$ echo "2.12 blah" | sed -r 's/^[0-9]+\.[0-9]+ //'
blah

Ou para o BSD sed :

$ echo "2.12 blah" | sed -E 's/^[0-9]+\.[0-9]+ //'
blah

Dessa forma, você não precisa de um regex diferente para versões diferentes de sed . Com o seu exemplo:

$ cat test
3.15 Chichewa
3.16 Chimane
3.17 Cinghalais
3.18 Créole de Guinée-Bissau

$ sed -r 's/^[0-9]+\.[0-9]+ //' test
Chichewa
Chimane
Cinghalais
Créole de Guinée-Bissau

Se o problema real é que você deseja obter a segunda coluna de um arquivo delimitado por espaço em branco, então você está indo sobre isso da maneira errada. Use awk , como o @Srdjan Grubor, ou use cut :

$ echo "2.12 foo bar baz" | cut -d' ' -f2-
foo bar baz

O -f2- especifica a segunda e todas as colunas a seguir, portanto, basicamente, ocupará o primeiro espaço como separador e exibirá o restante.

    
por 31.03.2013 / 21:03
7

Por que não usar o awk?

cat  input.txt | awk '{print $2}' > output.txt
    
por 31.03.2013 / 20:46
2

Se a única coisa é deixar tudo para trás e incluir o primeiro espaço, então isso é suficiente

sed -e 's/[^ ]* //'
    
por 31.03.2013 / 23:18
1

Você também pode usar o grep:

grep -oP '[a-zA-Z]+$' input.txt > output.txt

    
por 31.03.2013 / 23:09
1

com qualquer sed:

sed 's/^[0-9]\{1,\}\.[0-9]\{1,\} //' 

Ou talvez isso seja suficiente:

sed 's/^[0-9.]\{1,\} //' file
    
por 01.04.2013 / 12:12

Tags