LinuxForum.Fans
Тема

Удаление строк по маске легко, а если масок много ?

Автор: vovanvster 8 сообщений 5788 просмотров
#298200

При помощи sed очень просто удалять строки содержащие определённые слова. (Решено)

sed -i /"string"/d file.txt

А если значений "string" много ? Можно ли автоматизировать чтобы не пришлось снова и снова вводить одну и ту же команду с разными значениями ? Какой нибудь простой скрипт, для считывания по очереди строк из одного файла и передачи их для sed в качестве масок.

Понимаю что для этой задачи надо написать что-то на питоне но для начала меня устроит и самое простое решение.
Заранее благодарен.

#298202

Если нужно удалить именно строку, достаточно возможностей grep:
[console]
lupo@gentoo-laptop /tmp % cat template.txt
123
456
789
lupo@gentoo-laptop /tmp % cat test.txt
123
234
345
678
456
789
lupo@gentoo-laptop /tmp % grep -v -f template.txt test.txt
234
345
678
[/console]

#298211

К сожалению этого не достаточно. Из первого файла надо удалить все строки которые содержат в себе как фрагменты строки из второго файла.

text

#cat file_1.txt
123djhjkd
123drhg
123sshjkds
456dfyjh
456fjthk
456jzdfjj
789dhgj
789fgkjj

#cat file_2.txt 123 789

#sed -i /"123"/d file_1.txt

#sed -i /"789"/d file_1.txt

#cat file_1.txt 456dfyjh 456fjthk 456jzdfjj

В данном примере надо удалить строки которые содержат "123" и "789".

#298212

[console]
lupo@gentoo-laptop /tmp $ cat file_1.txt
123djhjkd
123drhg
123sshjkds
456dfyjh
456fjthk
456jzdfjj
789dhgj
789fgkjj
lupo@gentoo-laptop /tmp $ cat file_2.txt
123
789
lupo@gentoo-laptop /tmp $ grep -v -f file_2.txt file_1.txt
456dfyjh
456fjthk
456jzdfjj
[/console]

#298213

[console]
lupo@gentoo-laptop /tmp $ sed -i '/[123|789]/d' file_1.txt
lupo@gentoo-laptop /tmp $ cat file_1.txt
456dfyjh
456fjthk
456jzdfjj
[/console]

#298215

Второй вариант не подходит если значений несколько десятков. А от grep я таких чудес не ожидал.
Пойду внимательно читать man grep.

Да, с использованием grep всё получилось. Спасибо Вам огромное.

#298221

Чтобы не было проблем со спец. символами, используйте fgrep или grep -F.

ЗЫ. И не работайте от root ;)

#298227

Спасибо, учту. Хотя в этот раз я по ошибке не тот файл подсунул.

P.S. Использую su *YES*

Войдите или зарегистрируйтесь, чтобы ответить.