grep - удаление текста после токена-разделителя

12

У меня есть файл, в котором мне нужно удалить все после первого ;в каждой строке.

Итак, такой файл:

sdfsdsdf;
fsdfsddf;sdfsd;

Приведет к этому:

sdfsdsdf
fsdfsddf

Я изучил grepи sed. Буду признателен за ответ, включающий любую из этих команд.

уборщик мусора
источник

Ответы:

5

sed вероятно, проще и быстрее, чем awk или perl в этих обстоятельствах:

sed 's/^\([^;][^;]*\);.*$/\1/' some_file_name
Брюс Эдигер
источник
6
Это сложнее, чем должно быть! sed 's/;.*//'
Жиль "ТАК - прекрати быть злым"
Позволю себе не согласиться. perl -pe 's /;.*//' some_file_name также прост и, вероятно, на 1500% быстрее при работе с большими файлами.
заголовок
У меня есть несколько систем, где sed доступен, но perl нет, поэтому я рекомендую использовать более легкие решения там, где их достаточно.
dubiousjim
7

Другой вариант - использовать cutкоманду

cat a.file | cut -d';' -f1
Richm
источник
9
бесполезный нам кот
3

Я обычно использую awkдля таких вещей:

cat a.file | awk -F=";" '{ print $1 }'

Это займет каждую строку файла и напечатает первую группу перед разделителем -F

Марко Чеппи
источник
7
бесполезное использование cat.
Приостановлено до дальнейшего уведомления.
1
Второй Деннис там. А под Linux и BSD это -F = ";" не работает как задумано. И вы, возможно, захотите процитировать и этот 1 доллар: awk -F ";" '{print $ 1}' a.file
кодовый заголовок
2

Вот способ сделать это с помощью GNU grep:

grep -Po "^[^;]+(?=;?)" filename
Приостановлено до дальнейшего уведомления.
источник
Без Gnu grep: grep -Eo '^[^;]+;' filenameпочти получает, просто печатает один символ слишком много. grep -Eo '^[^;]+' filenameпочти тоже получает, но он также будет печатать полные (непустые) строки, которые не имеют никаких ;.
dubiousjim