Использование sed / awk для удаления чего-либо после первого пробела

20
aaaaaaaa 09  
bbbbbbbb 90   
ccccccccccccccc  89  
ddddd 09

Используя sed / awk / replace, в приведенном выше тексте я хочу удалить все, что идет после первого пробела в каждой строке. Например, вывод будет:

aaaaaaaa  
bbbbbbbb    
ccccccccccccccc  
ddddd 

любая помощь будет оценена.

Рана Хан
источник

Ответы:

35

Sed

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

Grep

grep -o '^\S*'

Awk

awk '{print $1}'

Как указано в комментариях, -oэто не POSIX; однако как в GNU, так и в BSD он есть, поэтому он должен работать для большинства людей.

Кроме того, \s/ \Sможет быть не во всех системах, если ваша не распознает его, вы можете использовать буквальный пробел, или если вы хотите пробел и табуляцию, те, которые в выражении в скобках ( [...]), или [[:blank:]]класс символов (обратите внимание, что строго говоря \sэто эквивалентно [[:space:]]и включает в себя вертикальные символы, такие как CR, LF или VT, которые вам, вероятно, не нужны).

awk Один предполагает , что линии не начинаются с пробелом.

Kevin
источник
14
cut -d ' ' -f 1 < your-file

будет самым эффективным.

Стефан Шазелас
источник
4
Я заметил это в нескольких ваших ответах, и мне было интересно, есть ли причина для этого: вы всегда, кажется, добавляете перенаправление ввода, даже когда команда может работать без него. Не могли бы вы объяснить, почему <это полезно здесь?
Джозеф Р.
5
@JosephR. Вы имеете в виду cut < fileпротив cut file? Тогда см. Unix.stackexchange.com/a/70759/22565
Стефан
сокращение может быть лучшим решением для таких простых проблем. Я бы зарезервировал awk (или perl) для более сложного соответствия.
ChuckCottrill
@StephaneChazelas Спасибо за (характерное) понимание :)
Джозеф Р.
1

И один через perl,

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

Через GNU grep,

$ grep -oP '^[^ ]*' file
bbbbbbbb
ccccccccccccccc
ddddd
Авинаш Радж
источник