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

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