У меня есть текстовый файл в Linux, где содержимое, как показано ниже:
help.helloworld.com:latest.world.com
dev.helloworld.com:latest.world.com
Я хочу получить содержимое перед двоеточием, как показано ниже:
help.helloworld.com
dev.helloworld.com
Как я могу сделать это в терминале?
text-processing
grep
Габриал Джонас
источник
источник
grep
Утилита используется для поиска для линий , соответствующих регулярных выражений. Возможно, вы могли бы использовать его здесь, но было бы более целесообразно использовать инструмент, который извлекает данные из полей с заданным разделителем, например,cut
утилиту.grep
это правильный инструмент для решения реальной проблемы. проблема.Ответы:
Это то, что
cut
для:Вы просто устанавливаете разделитель на
:
с-d:
и говорите, что нужно печатать только 1-е поле (-f1
).источник
Или альтернатива:
Это возвращает любые символы, начинающиеся в начале каждой строки (
^
), которые не являются двоеточиями ([^:]*
).источник
Определенно рекомендую
awk
:Используется
:
как разделитель полей и печатает первое поле.источник
обновленный ответ
Учитывая следующий файл
file.txt
:Вы можете использовать,
sed
чтобы удалить все после двоеточия:Это работает для всех угловых случаев, указанных в комментариях - если оно заканчивается двоеточием или если двоеточия нет, хотя они не были упомянуты в самом вопросе. Спасибо @Rakesh Sharma, @mirabilos и @Freddy за их комментарии. Ответы на вопросы - отличный способ учиться.
источник
sed -e 's/:.*//' file.txt
это еще один способ с Posix sed.sed -ne 'y/:/\n/;P' file.txt
также можно использовать.+
до.*
if
вs///p
синтаксисе, вам необходимо изменить свое регулярное выражение , чтобы заботиться о линии без какого - либо двоеточия, что - то вроде,sed -nEe 's/([^:]*)(:.*|)/\1/p'
. Обратите внимание, что это требует,GNU sed
но, так как в любом случае вы находитесь на GNU sed, это не должно иметь значения.sed -n '/:/s/^\([^:]*\):.*$/\1/p
(добавьте,--posix
если вы используете GNU sed, просто несмотря на их расширение)Вы имеете в виду, как это:
Вывод:
источник
echo foo:bar:baz | grep -oP '.*(?=:)'
. Это будет работать для примера OP, но не для общего случая, как описано в вопросе.Этого можно добиться с помощью обработки строки bash, удалив самое длинное совпадение из строки непосредственно для каждой строки, читаемой следующим образом:
Это может быть полезной альтернативой, если вы анализируете файл в сценарии оболочки (хотя я подозреваю, что использование cut может быть более эффективным).
источник
В чистой оболочке POSIX без использования внешних команд я бы сделал:
источник