Получить содержимое перед двоеточием

8

У меня есть текстовый файл в Linux, где содержимое, как показано ниже:

help.helloworld.com:latest.world.com
dev.helloworld.com:latest.world.com

Я хочу получить содержимое перед двоеточием, как показано ниже:

help.helloworld.com
dev.helloworld.com

Как я могу сделать это в терминале?

Габриал Джонас
источник
2
grepУтилита используется для поиска для линий , соответствующих регулярных выражений. Возможно, вы могли бы использовать его здесь, но было бы более целесообразно использовать инструмент, который извлекает данные из полей с заданным разделителем, например, cutутилиту.
Кусалананда
Я отправил правку, чтобы убрать слово «grep» и заменить его на «найти» в заголовке и «получить» в теле вопроса, чтобы избежать проблемы X / Y, предполагая, что grepэто правильный инструмент для решения реальной проблемы. проблема.
Монти Хардер
1
Все, что я могу сказать, это то, что содержимое перед двоеточием гораздо лучше содержимого после двоеточия ;-).
Питер - Восстановить Монику

Ответы:

35

Это то, что cutдля:

$ cat file
help.helloworld.com:latest.world.com
dev.helloworld.com:latest.world.com
foo:baz:bar
foo

$ cut -d: -f1 file
help.helloworld.com
dev.helloworld.com
foo
foo

Вы просто устанавливаете разделитель на :с -d:и говорите, что нужно печатать только 1-е поле ( -f1).

Тердон
источник
19

Или альтернатива:

$ grep -o '^[^:]*' file
help.helloworld.com
dev.helloworld.com

Это возвращает любые символы, начинающиеся в начале каждой строки ( ^), которые не являются двоеточиями ( [^:]*).

Фредди
источник
18

Определенно рекомендую awk:

awk -F ':' '{print $1}' file

Используется :как разделитель полей и печатает первое поле.

Centimane
источник
5

обновленный ответ

Учитывая следующий файл file.txt:

help.helloworld.com:latest.world.com
dev.helloworld.com:latest.world.com
no.colon.com
colon.at.the.end.com:

Вы можете использовать, sedчтобы удалить все после двоеточия:

sed -e 's/:.*//' file.txt

Это работает для всех угловых случаев, указанных в комментариях - если оно заканчивается двоеточием или если двоеточия нет, хотя они не были упомянуты в самом вопросе. Спасибо @Rakesh Sharma, @mirabilos и @Freddy за их комментарии. Ответы на вопросы - отличный способ учиться.

Рэнди Жослейн
источник
4
sed -e 's/:.*//' file.txtэто еще один способ с Posix sed.
Ракеш Шарма
1
sed -ne 'y/:/\n/;P' file.txtтакже можно использовать
Ракеш Шарма
Сделать .+до.*
Ракеш Шарма
@Randy Joselyn Поскольку существует неявная ifв s///pсинтаксисе, вам необходимо изменить свое регулярное выражение , чтобы заботиться о линии без какого - либо двоеточия, что - то вроде, sed -nEe 's/([^:]*)(:.*|)/\1/p'. Обратите внимание, что это требует, GNU sedно, так как в любом случае вы находитесь на GNU sed, это не должно иметь значения.
Ракеш Шарма
Этот ответ мог бы быть моим любимым, но ERE не нужны. sed -n '/:/s/^\([^:]*\):.*$/\1/p(добавьте, --posixесли вы используете GNU sed, просто несмотря на их расширение)
mirabilos
4

Требуется GNU grep. Он не будет работать с grep по умолчанию, например, на macOS или любом другом BSD.

Вы имеете в виду, как это:

grep -oP '.*(?=:)' file

Вывод:

help.helloworld.com
dev.helloworld.com
schrodigerscatcuriosity
источник
4
Если в строке два или более двоеточия, будет напечатано все до последнего, поэтому не то, что нужно OP. Попробуй echo foo:bar:baz | grep -oP '.*(?=:)'. Это будет работать для примера OP, но не для общего случая, как описано в вопросе.
Тердон
есть только одна двоеточие и она работает нормально, но спасибо за обновление
Gabrial Johnas
-1

Этого можно добиться с помощью обработки строки bash, удалив самое длинное совпадение из строки непосредственно для каждой строки, читаемой следующим образом:

for line in $(cat inputfile); do echo "${line%%:*}"; done

Это может быть полезной альтернативой, если вы анализируете файл в сценарии оболочки (хотя я подозреваю, что использование cut может быть более эффективным).

Джим Риппон
источник