2013-09-27 3 views
0

У меня есть большой файл, который выглядит следующим образом:Как удалить строки из файла, которые не соответствуют регулярному выражению?

7f0c41d6-f9c6-47aa-a034-d40bc629c973.csv 
159890 
159891 
24faaed6-62ee-4175-8430-5d73b09911c8.csv 
159907 
5bad221f-25ef-44fa-9086-fd152e697928.csv 
642e4ac3-3d46-4b4c-b5c8-aa2fa54d0b04.csv 
d0e145a5-ceb8-4d4b-ae47-11e0c9a6548d.csv 
159929 
ba678cbd-af57-493b-a69e-e7504b4bc328.csv 
7750840f-9bf9-4a68-9f25-a2ba0968d481.csv 
159955 
159959 

И я интересен только в *.csv файлов, может кто-то момент мне, как удалить файлы, которые не заканчиваются .csv.

спасибо.

ответ

8
grep "\.csv$" file 

вытащит только те строки, оканчивающиеся в .csv

Затем, если вы хотите, чтобы поместить их в другой файл;

grep "\.csv$" file > newfile 
+1

+1 'grep" \ .csv $ "file> new_file';) – alfasin

+0

Спасибо, он работает – Vor

3

sed ваш друг:

sed -i.bak '/\.csv$/!d' file 

-i.bak: в месте редактирования. создает резервную копию файла с .bak расширения

+0

спасибо, что это хорошая альтернатива. – Vor

2
([0-9a-zA-Z-]*.csv$) 

Это регулярное выражение код, который только выбрать имя файла, оканчивающийся .csv расширений.

Надеюсь, это вам поможет. see this image for detail

+0

Как называется инструмент? – Vor

+0

Только выбор линий не решает проблему – jkshah

+0

@Vor Это [rubular] (http://rubular.com/). – Jerry

1

Если вы знакомы с ВИМ текстовым редактором (ВИМ или VI, как правило, установлен на многих Линукс коробки), используйте следующую команду ВИМ режим Ex для удаления строки, которые не соответствуют определенному шаблону:

:v/<pattern>/d 

Например, если бы я хотел, чтобы удалить все строки, которые не содержат "column" я бы запустить:

:v/"column"/d 

Надеется, что это помогает.

1

Если вы не хотите, чтобы вы сохраняли имена файлов в другом файле только для удаления нежелательных файлов, это также может быть добавленное решение для ваших нужд (понимая, что это старый вопрос).

Эта единственная строка for с использованием решения grep "\.csv" file рекурсивно, поэтому вам не нужно управлять именами нескольких файлов, которые будут сохранены здесь или там.

for f in *; do if [ ! "$(echo ${f} | grep -Eo '.csv')" == ".csv" ]; then rm "${f}"; fi; done 

В визуальной помощи, чтобы показать вам, что это работает, как предполагалось (для удаления всех файлов, за исключением файлов CSV) вот быстрый и грязный скриншот, показывающий результаты, используя свой пример вывода.

enter image description here

А вот немного короче версия команды однолинейной:

for f in *; do if [ ! "$(echo ${f} | grep -o '.csv')" ]; then rm "${f}"; fi; done 

А вот это пример вывода с использованием имен CSV файлов вашего образца и некоторые случайно сгенерированных текстовые файлы.

enter image description here

Цель использования такого цикла с условным является, чтобы гарантировать вам только избавиться от файлов, которые вы хотите ушли (не-CSV-файлов) и только в текущем рабочем каталоге без разбора ls команда.

Надеюсь, это поможет вам и всем, кто ищет аналогичное решение.

Смежные вопросы