- Удаление строк, Dno, 12:30 , 10-Дек-12 (1)
А grep использовать не судьба (grep -vf ..)?
- Удаление строк, romiks, 12:48 , 10-Дек-12 (3)
> А grep использовать не судьба (grep -vf ..)?Да и на sed можно (sed -i '' /ip/d) Но нужно на perl
- Удаление строк, qqq, 12:46 , 10-Дек-12 (2)
> Всем здравствовать! > Есть 1 файл. Со строками. > В каждой строке есть бла-бла-бла IP-адрес бла-бла-бла. > То есть текст и в нём IP-адрес. > Есть 2 файл. Чисто с одними IP-адресами. > Нужно удалить из файла 1 все строки, > в которых встречаются ip из файла 2.for a in `cat /path/to/file2`; do sed -i -e "/$a/d" path/to/file1; done
- Удаление строк, romiks, 12:57 , 10-Дек-12 (4)
>> Всем здравствовать! >> Есть 1 файл. Со строками. >> В каждой строке есть бла-бла-бла IP-адрес бла-бла-бла. >> То есть текст и в нём IP-адрес. >> Есть 2 файл. Чисто с одними IP-адресами. >> Нужно удалить из файла 1 все строки, >> в которых встречаются ip из файла 2. > for a in `cat /path/to/file2`; do sed -i -e "/$a/d" path/to/file1; done Да, пробовал уже, аналогично. Проблема вылазит, в шеловском скрипте удаляет, скажем, кроме 192.168.1.3 и ещё кучу таких как 192.168.1.32, 192.168.1.39 и иже с ним. как указать sed'у конец строки? /^ip$/d не проходит, не понимает он конец строки $ (не понимает имеенно в sh скрипте)
- Удаление строк, qqq, 13:20 , 10-Дек-12 (5)
> Проблема вылазит, в шеловском скрипте удаляет, скажем, кроме 192.168.1.3 > и ещё кучу таких как 192.168.1.32, 192.168.1.39 и иже с ним. > как указать sed'у конец строки? > /^ip$/d не проходит, не понимает он конец строки $ (не понимает имеенно > в sh скрипте) нужно экранирование, т.е. for a in `cat /path/to/file2`; do sed -i -e "/$a\$/d" path/to/file1; done если IP действительно стоит в конце строки. Зачастую перед "концом" стоки еще стоит пробел, и тогда регэксп не отработает, следует видоизменить на "/$a /d". Ну или у вас могут быть какие-то другие характерные признаки, если IP стоит в тексте между другими словами/символами, тогда добавьте два пробела "/ $a /d". В общем, экспериментируйте.
- Удаление строк, romiks, 14:40 , 10-Дек-12 (7)
>[оверквотинг удален] >> /^ip$/d не проходит, не понимает он конец строки $ (не понимает имеенно >> в sh скрипте) > нужно экранирование, т.е. > for a in `cat /path/to/file2`; do sed -i -e "/$a\$/d" path/to/file1; done > если IP действительно стоит в конце строки. Зачастую перед "концом" стоки еще > стоит пробел, и тогда регэксп не отработает, следует видоизменить на "/$a > /d". > Ну или у вас могут быть какие-то другие характерные признаки, если IP > стоит в тексте между другими словами/символами, тогда добавьте два пробела "/ > $a /d". В общем, экспериментируйте.А вы сами пробовали с экранированием? Я - да, не помогает. Причём, в различных вариациях. И с двумя кавычками, и с одной. Результат один. Потому как у sed'а своё "понимание" $(конец строки) , а у sh - своё (переменная)
cat file1 text1 192.168.1.1 text text2 192.168.2.1 text text2 192.168.2.11 text text3 192.168.3.1 text cat file2 192.168.2.1
cat test.sh
/bin/sh ip="file2" for i in $(cat ${ip}); do sed -i '' /$i/d file1 done
sed -i "" /$i/d file1 sed -i "" /$i$/d file1 sed -i "" '/$i$/d' file1 sed -i "" "/$i$/d" file1 Безрезультатно. И если заслешивать конец строки - то есть \$ А вот с пробелами - работает. Или с дополнительным символом в конце ip адреса, например если file1 имеет вид text1 192.168.1.1; text text2 192.168.2.1; text text2 192.168.2.11; text text3 192.168.3.1; text тогда - да так работает - sed -i "" /$i\;/d file1 Спасибо за помощь!
- Удаление строк, qqq, 14:50 , 10-Дек-12 (8)
>[оверквотинг удален] > Я - да, не помогает. Причём, в различных вариациях. > И с двумя кавычками, и с одной. Результат один. > Потому как у sed'а своё "понимание" $(конец строки) , > а у sh - своё (переменная) > > cat file1 > text1 192.168.1.1 text > text2 192.168.2.1 text > text2 192.168.2.11 text > text3 192.168.3.1 text а вот скажите, пожалуйста, с какого это бы седу удалять по регэкспу $ip\$ (ip адрес+конец строки), если у вас ip находится в *середине* строки? откуда взяться символу конца строки посреди стоки?
- Удаление строк, romiks, 15:32 , 10-Дек-12 (10)
> а вот скажите, пожалуйста, с какого это бы седу удалять по регэкспу > $ip\$ (ip адрес+конец строки), если у вас ip находится в *середине* > строки? откуда взяться символу конца строки посреди стоки?Согласен! Косяк мой. Не туда смотрел, блин. Всё работает. text1 192.168.1.1 text2 192.168.2.1 text2 192.168.2.11 text3 192.168.3.1 sed -i "" "/$i$/d" file1 text1 192.168.1.1 text2 192.168.2.11 text3 192.168.3.1 Простите меня! )))
- Удаление строк, XAnder, 14:03 , 10-Дек-12 (6)
> Есть 1 файл. Со строками. > В каждой строке есть бла-бла-бла IP-адрес бла-бла-бла. > То есть текст и в нём IP-адрес. > Есть 2 файл. Чисто с одними IP-адресами. > Нужно удалить из файла 1 все строки, > в которых встречаются ip из файла 2.my %ips = (); open FH, 'file2'; while (<FH>) { chomp; $ips{$_} = 1; } close FH;open FH, 'file1'; while (<FH>) { next unless m/\b(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})\b/; print $_ unless exists $ips{$1}; } close FH;
Идея с хешем, думаю, понятна. PS. На работоспособность не проверял, если что.
- Удаление строк, romiks, 15:21 , 10-Дек-12 (9)
>[оверквотинг удален] > } > close FH; > open FH, 'file1'; > while (<FH>) { > next unless m/\b(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})\b/; > print $_ unless exists $ips{$1}; > } > close FH; > Идея с хешем, думаю, понятна. > PS. На работоспособность не проверял, если что.Да! Работает! Спасибо!
|