LinuxForum.Fans
Тема

sed вопрос про удаление строк с исключением некоторых.

Автор: shonty 14 сообщений 6285 просмотров
#285756

Всем привет. Начитался описаний и примеров, но не нашёл то что мне нужно.
Не могу справиться с проблемой:
необходимо удалить строки содержащие некое выражение, но оставить строки содержащие другое выражение.
подобно замене sed '/baz/s/foo/bar/g' или sed '/baz/!s/foo/bar/g'

На примере:
в файле содержаться строки c "e-mail: "

text
e-mail: 
e-mail: 123@mail.ru
e-mail: 
e-mail: 456@mail.com
e-mail: 
e-mail: 

Необходимо удалить только строки в которых нет электронного адреса

#285758

sed обязателен?
[console]
lupo@gentoo-laptop /tmp % cat email.txt
e-mail:
e-mail: 123@mail.ru
e-mail:
e-mail: 456@mail.com
e-mail:
e-mail:
lupo@gentoo-laptop /tmp % awk -F ': ' '$2!="" {print}' email.txt
e-mail: 123@mail.ru
e-mail: 456@mail.com
[/console]

#285769

можно так:
sed '/^e-mail:\s$/d'
есть ещё 2-3 способа с sed'ом/grep'ом...

#285778

спасибо, но примеры с grep и awk-ом не подходят, так как нужно именно удалять строки из текстового файла. Содержание примерно такое:

Показать
Т Е К С Т
Контактное лицо: Сан Саныч
Телефон 1: 3434343434
Телефон 2:
e-mail:
Город:
Организация: ООО СоюзКопоть
Дата добавления: 16 Ноя 2012

Многие поля остаются незаполненными. Файл и так объёмный, по этому хочу удалить ненужное

"Fat-Zer" написал:
sed '/^e-mail:\s$/d'

так тоже пробовал, но у меня это не работает, строки без адреса всёравно оставляет.
Так тоже не работает:

text
sed '/^e-mail:\( \)$/d'

Работает так:
sed -e '/@/!s/^e-mail:\( \)//g' или sed -e '/@/!s/^e-mail:\s//g' оставляя пустую строку.
но не работает sed '/@/!s/^e-mail:\s$//g' или sed '/@/!s/^e-mail:\s$//g
Хотя в файле после двоеточия стоит пробел и конец строки.

Я кажется разобрался в чём проблема:
текстовый файл создан из HTML, скаченного wget-ом путём удалением тегов и вырезания нужного/ненужного
На созданном с нуля *.txt файле sed '/^e-mail:\s$/d' работает, а на этом нет.

Проблема в конце строк.
Как исправить, подскажите plz

#285781
"shonty" написал:
Проблема в конце строк.
Как исправить, подскажите plz

Покажите, что в конце строк, т. е.

text

cat -A FILE
#285783

Всем спасибо, и извините за беспокойство)))

Поставил в Geany "отображать завершение строк"

Показать

Всё чиниться простой командой sed 's/.$//' которую нужно выполнить в самом начале редактирования.
Иначе у меня вперемежку CR/LF и LF

#285784
"shonty" написал:
Всё чиниться простой командой sed 's/.$//' которую нужно выполнить в самом начале редактирования.
Иначе у меня вперемежку CR/LF и LF

Хорошо, если всё в порядке, хотя странно... Ваша команда просто удалит последний символ. Я подобные «неправильные» строки исправляю так:

text

sed 's/\r//g' FILE

или так

text

tr -d '\r' < BAD_FILE > FILE
#285785
"Lupo Alberto" написал:
Хорошо, если всё в порядке, хотя странно... Ваша команда просто удалит последний символ. Я подобные «неправильные» строки исправляю так:
sed 's/\r//g' FILE

Спасибо.

sed 's/.$//' взял от сюда
Первый пример под заголовком "Преобразование и замена текста:"
Там пояснение к команде: (подразумевается что все строки заканчиваются с CR/LF)
Я её в самое начало скрипта вставил.

#285786

PS
Из за тотального преобладания объёма рекламы над объём полезной информации перехожу к просмотру "любимых" сайтов в режиме OffLine. ;)

#285793
"shonty" написал:
так тоже пробовал, но у меня это не работает, строки без адреса всёравно оставляет.

моя оплошность... вот так правильно, конечно:
sed '/^e-mail:\s*$/d'
на что строки в таком случае заканчиваются безразлично...

#285803

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

text

#!/usr/bin/env python
#_*_ coding: utf-8 _*_

f = open ('file.txt', 'r') lines = f.readlines() for line in lines: if not line.rstrip().split(':')[1]: lines.remove(line) f = open ('file.txt', 'w') f.writelines(lines) f.close()

#285810

Fat-Zer и -=Serj=- спасибо вам

"Fat-Zer" написал:
sed '/^e-mail:\s*$/d'
на что строки в таком случае заканчиваются безразлично...

Спасибо, учту, но думаю, что файл лучше сначала привести к одному виду (знаменателю), что впредь и буду делать))

#285813

Гы. Мой вариант лучше переделать так

text

#!/usr/bin/env python
#_*_ coding: utf-8 _*_

f = open('file.txt', 'r') lines = f.readlines() lines = [line for line in lines if line.rstrip().split(':')[1]] f = open('file.txt', 'w') f.writelines(lines) f.close()

Иначе получается редактирование списка во время итераций.

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