Usando sed / awk para remover qualquer coisa após o primeiro espaço

20
aaaaaaaa 09  
bbbbbbbb 90   
ccccccccccccccc  89  
ddddd 09

Usando sed / awk / replace, no texto acima, desejo remover qualquer coisa que venha após o primeiro espaço em cada linha. Por exemplo, a saída será:

aaaaaaaa  
bbbbbbbb    
ccccccccccccccc  
ddddd 

Qualquer ajuda será apreciada.

Rana Khan
fonte

Respostas:

35

Sed

sed 's/\s.*$//'

Grep

grep -o '^\S*'

Awk

awk '{print $1}'

Como apontado nos comentários, -onão é POSIX; no entanto, tanto o GNU quanto o BSD o possuem, portanto ele deve funcionar para a maioria das pessoas.

Além disso, \s/ \Spode não estar em todos os sistemas. Se o seu não o reconhecer, você poderá usar um espaço literal, ou se desejar espaço e tabulação, aqueles em uma expressão entre colchetes ( [...]) ou a [[:blank:]]classe de caractere (observe que, estritamente falando, \sé equivalente [[:space:]]ae inclui caracteres de espaçamento vertical, bem como CR, LF ou VT, dos quais você provavelmente não se importa).

O awk supõe-se as linhas não começar com um personagem em branco.

Kevin
fonte
14
cut -d ' ' -f 1 < your-file

seria o mais eficiente.

Stéphane Chazelas
fonte
4
Percebi isso em várias de suas respostas e fiquei pensando se há uma razão para isso: você sempre parece adicionar redirecionamento de entrada mesmo quando o comando pode funcionar sem ele. Você pode explicar por que isso <é útil aqui?
Joseph R.
5
@JosephR. Você quer dizer cut < filevs cut file? Então veja unix.stackexchange.com/a/70759/22565
Stéphane Chazelas
corte pode ser a melhor solução para problemas tão simples. Eu reservaria awk (ou perl) para uma correspondência mais complexa.
ChuckCottrill
@StephaneChazelas Obrigado pelo insight (característica) :)
Joseph R.
5
awk '{print $1}' file

ou

sed 's/ .*//'
jlliagre
fonte
1

E a única perl,

$ perl -pe 's/^([^ ]+) .*$/\1/' file
aaaaaaaa
bbbbbbbb
ccccccccccccccc
ddddd

Através do GNU grep,

$ grep -oP '^[^ ]*' file
bbbbbbbb
ccccccccccccccc
ddddd
Avinash Raj
fonte