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


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

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


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

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

есть только одна двоеточие и она работает нормально, но спасибо за обновление
Gabrial Johnas

-1

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

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

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



Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.