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


12

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

Отже, такий файл:

sdfsdsdf;
fsdfsddf;sdfsd;

Це призведе до цього:

sdfsdsdf
fsdfsddf

Я заглянув у grepта sed. Буду вдячний за відповідь, що містить будь-яку з цих команд.

Відповіді:


5

sed Мабуть, найлегше і швидше, ніж awk або perl в цій обставині:

sed 's/^\([^;][^;]*\);.*$/\1/' some_file_name

6
Це складніше, ніж має бути! sed 's/;.*//'
Жил 'SO- перестань бути злим'

Дозволю собі не погодитися. perl -pe 's / ;.*//' some_file_name так само просто і, мабуть, до 1500% швидше при роботі з великими файлами.
заголовок

У мене є кілька систем, де є sed, але perl немає, тому я рекомендую використовувати більш легкі розчини, де їх достатньо.
сумнівним

7

інший варіант - використовувати cutкоманду

cat a.file | cut -d';' -f1

9
марний нам кіт

3

Я зазвичай використовую awkтакі речі:

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

Це займе кожен рядок файлу і надрукує першу групу перед роздільником -F



1
Там другий Денніс. А під Linux та BSD -F = ";" не працює за призначенням. І ви можете також процитувати той $ 1: awk -F ";" '{print $ 1}' a.file
codehead

2

Ось спосіб це зробити за допомогою GNU grep:

grep -Po "^[^;]+(?=;?)" filename

Без Gnu grep: grep -Eo '^[^;]+;' filenameмайже виходить, він просто надрукує один символ занадто багато. grep -Eo '^[^;]+' filenameмайже також отримує його, але він також буде друкувати повні (не порожні) рядки, у яких немає жодного ;.
сумнівним
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.