1

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

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

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

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

2

sed обязателен?

 Консоль:

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

Был, был и весь вышел...

3

 Консоль:

lupo@gentoo-laptop /tmp $ grep @ email.txt
e-mail: 123@mail.ru
e-mail: 456@mail.com

Был, был и весь вышел...

4

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

95% процентов проблем находятся между клавиатурой и стулом.

5 (18.11.2012 08:31:39 отредактировано shonty)

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

+ открыть спойлер

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

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

Fat-Zer пишет:

sed '/^e-mail:\s$/d'

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

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

6

shonty пишет:

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

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

cat -A FILE
Был, был и весь вышел...

7

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

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

+ открыть спойлер

http://img641.imageshack.us/img641/462/10144083.png

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

8

shonty пишет:

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

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

sed 's/\r//g' FILE

или так

tr -d '\r' < BAD_FILE > FILE
Был, был и весь вышел...

9 (18.11.2012 10:29:16 отредактировано shonty)

Lupo Alberto пишет:

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

Спасибо.

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

10 (18.11.2012 10:31:00 отредактировано shonty)

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

11

shonty пишет:

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

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

95% процентов проблем находятся между клавиатурой и стулом.

12 (18.11.2012 14:10:53 отредактировано -=Serj=-)

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

#!/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()
Да, у меня Ubuntu.
Нет, не глючит.

13

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

Fat-Zer пишет:

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

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

14

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

#!/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()

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

Да, у меня Ubuntu.
Нет, не глючит.