Другое короткое awk решение:
awk -F, '$3~"SAMS CLUB"{sub("S ","\047S ",$3)}1' OFS=',' filename1 > filename2
Это то, что 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
).
Requires GNU grep. It would not work with the default grep on e.g. macOS or any of the other BSDs.
Вы имеете в виду вот так:
grep -oP '.*(?=:)' file
Выход:
help.helloworld.com
dev.helloworld.com
Или альтернатива:
$ grep -o '^[^:]*' file
help.helloworld.com
dev.helloworld.com
Это возвращает любые символы, начинающиеся в начале каждой строки (^
), которые не являются двоеточиями ([^:]*
).
Однозначно рекомендуюawk
:
awk -F ':' '{print $1}' file
Использует :
как разделитель полей и печатает первое поле.
Рассматривая следующий файл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 за их комментарии. Отвечать на вопросы — отличный способ учиться.
Этого можно добиться с помощью обработки строк bash, удаляя самое длинное совпадение из строки непосредственно для каждой строки, читаемой следующим образом:
for line in $(cat inputfile); do echo "${line%%:*}"; done
Это может быть полезной альтернативой, если вы анализируете файл в сценарии оболочки (, хотя я подозреваю, что использование cut может быть более эффективным ).