The OpenNET Project / Index page

[ новости /+++ | форум | wiki | теги | ]

форумы  помощь  поиск  регистрация  майллист  вход/выход  слежка  RSS
"sed/perl замена символов в найденной построке"
Вариант для распечатки  
Пред. тема | След. тема 
Форумы Программирование под UNIX (Public)
Изначальное сообщение [ Отслеживать ]

"sed/perl замена символов в найденной построке"  
Сообщение от devcoder (ok) on 24-Май-08, 13:58 
Привет всем.
Есть строка вида
<a href="a:b:c:d" ...
нужно получить
<a href="a/b/c/d" ...

Простая замена в стиле tr не подойдёт,
так как вне найденной подстроки
менять символы нельзя.

Желательно на sed или perl.

Высказать мнение | Ответить | Правка | Cообщить модератору

 Оглавление

Сообщения по теме [Сортировка по времени | RSS]


1. "sed/perl замена символов в найденной построке"  
Сообщение от L0n3R4ng3r (ok) on 24-Май-08, 23:06 
>[оверквотинг удален]
>Есть строка вида
><a href="a:b:c:d" ...
>нужно получить
><a href="a/b/c/d" ...
>
>Простая замена в стиле tr не подойдёт,
>так как вне найденной подстроки
>менять символы нельзя.
>
>Желательно на sed или perl.

#!/bin/bash

while read line; do
echo $line | grep "href" &>/dev/null
if [ $? -eq 0 ];then
   echo $line | sed 's/:/\//g'
else
   echo $line
fi
done

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

2. "sed/perl замена символов в найденной построке"  
Сообщение от dev_coder email on 25-Май-08, 10:33 
Не прокатит, так как строка может быть

<a href="a:b:c:d" style="a:b; c:d;"

Вот, нашёл кое что в http://unix.derkeiler.com/Newsgroups/comp.unix.shell/2007-07...


echo "package,method(String:boolean:String):10:11:12" | \
   perl -pe's<(\([^()]+\))> <($:=$1)=~y(:)(/); $:>ge'

Только адаптировать под свой пример не получается :-(

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

3. "sed/perl замена символов в найденной построке"  
Сообщение от macss email(ok) on 25-Май-08, 11:47 
>[оверквотинг удален]
>Есть строка вида
><a href="a:b:c:d" ...
>нужно получить
><a href="a/b/c/d" ...
>
>Простая замена в стиле tr не подойдёт,
>так как вне найденной подстроки
>менять символы нельзя.
>
>Желательно на sed или perl.

sed -i '' 's/<a href="a:b:c:d"/<a href="a\/b\/c\/d"/g' file html

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

4. "sed/perl замена символов в найденной построке"  
Сообщение от macss email(ok) on 25-Май-08, 11:49 
>[оверквотинг удален]
>>нужно получить
>><a href="a/b/c/d" ...
>>
>>Простая замена в стиле tr не подойдёт,
>>так как вне найденной подстроки
>>менять символы нельзя.
>>
>>Желательно на sed или perl.
>
>sed -i '' 's/<a href="a:b:c:d"/<a href="a\/b\/c\/d"/g' file html

тоесть "file.html"
sed -i '' 's/<a href="a:b:c:d"/<a href="a\/b\/c\/d"/g' file.html

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

10. "sed/perl замена символов в найденной построке"  
Сообщение от madskull (??) on 26-Май-08, 15:04 
>>
>>sed -i '' 's/<a href="a:b:c:d"/<a href="a\/b\/c\/d"/g' file html
>
>тоесть "file.html"
>sed -i '' 's/<a href="a:b:c:d"/<a href="a\/b\/c\/d"/g' file.html

Спасибо, повеселил :)

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

5. "sed/perl замена символов в найденной построке"  
Сообщение от NuINu (??) on 26-Май-08, 11:27 
>[оверквотинг удален]
>Есть строка вида
><a href="a:b:c:d" ...
>нужно получить
><a href="a/b/c/d" ...
>
>Простая замена в стиле tr не подойдёт,
>так как вне найденной подстроки
>менять символы нельзя.
>
>Желательно на sed или perl.

#!/usr/bin/perl -w

use strict;

#просто раскоментируй ввод, и закоментируй тест
#my $in = <>;
my $in = "<a href=\"4f23a:342b:342c:3e32d\" ...";
my $out;

my $in_symb = '[^:"]';
my $del = '/';
my $shablon = "<a href=\"($in_symb+):($in_symb+):($in_symb+):($in_symb+)\"(.*)";
($out = $in) =~ s/$shablon/<a href="$1$del$2$del$3$del$4"$5/ig;

print("input\t: '$in'\n");
print("parsed\t: '$out'\n");

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

6. "sed/perl замена символов в найденной построке"  
Сообщение от devcoder (ok) on 26-Май-08, 11:42 
Это было бы легко, но строки могут быть такие:

<a style="a:b;" href="a:b:c:d" style="c:d;">
<img style="a:b;" src="a:b:c:d" style="c:d;">
<a style="a:b;" href="a:b:c:d" style="c:d;"><img style="a:b;" src="a:b:c:d" style="c:d;">
<a style="a:b;" href="http://a:b:c:d" style="c:d;">
...

Ниже, то что я родил на awk, работает.
Но может суровые бородатые перлачи напишут perl-однострочник :-)


function tr_href()
{
     awk '{ IGNORECASE=1
         r = "(href|src)[[:space:]]*=[[:space:]]*\"([^\"]+)\"[^>]*>";
         line = $0
         while ( 0 < match(line, r, a) ) {
            last_line = substr(line, RSTART + RLENGTH);
            # print "last line: ", last_line;
            if ( a[2] != "" ) {
               before_s = substr(line, 0, a[2,"start"]-1);
               after_s  = substr(line, a[2,"start"] + a[2,"length"], RSTART + RLENGTH - a[2,"start"] - a[2,"length"] )
               # print "after_s: ", after_s;
            
               proto = "";
               if ( match(a[2], /^(http|ftp|https):\/\//, p) ) {
                  proto = p[0];
                  tmp = substr(a[2], length(proto)+1);
               } else
                  tmp = a[2];
            
               gsub(/:/,"_", tmp);
               print before_s proto tmp after_s;
               line = last_line
            } else {
               print;
               line = "";
            }
         } /* while */
         if (line != "")
            print line
       }'
}

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

7. "sed/perl замена символов в найденной построке"  
Сообщение от NuINu (??) on 26-Май-08, 14:13 
>Это было бы легко, но строки могут быть такие:
>
 
><a style="a:b;" href="a:b:c:d" style="c:d;">
><img style="a:b;" src="a:b:c:d" style="c:d;">
><a style="a:b;" href="a:b:c:d" style="c:d;"><img style="a:b;" src="a:b:c:d" style="c:d;">
><a style="a:b;" href="http://a:b:c:d" style="c:d;">
>...
>

ну так ты сразу пиши чего хочешь.
>
>Ниже, то что я родил на awk, работает.
>Но может суровые бородатые перлачи напишут perl-однострочник :-)

не знаю может быть и напишут, ты подожди :)
а если менять везде по твоим примерам, да еще учитывая тот код что ты привел.
можно попробовать сделать так:

my $in;
my $out;

my $in_symb = '[^:"]';
my $del = '/';
my $shablon = "(href|src)=\"(((?imsx-imsx:http|ftp|https)://)*)($in_symb+):($in_symb+):($in_symb+):($in_symb+)\"";

while ($in = <>) {
    ($out = $in) =~ s/$shablon/$1="$2$4$del$5$del$6$del$7"/gi;
    print("input\t: '$in'\n");
    print("parsed\t: '$out'\n");
}

а уж однострочник ты сам делай. ну и поиск пробелов я не делал, ведь в примерах и нет, не обессудь.

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

8. "sed/perl замена символов в найденной построке"  
Сообщение от devcoder (ok) on 26-Май-08, 14:20 
>ну так ты сразу пиши чего хочешь.

:-) я бы до сих пор комбинации набивал

>>
>>Ниже, то что я родил на awk, работает.
>>Но может суровые бородатые перлачи напишут perl-однострочник :-)
>
>не знаю может быть и напишут, ты подожди :)

Сейчас, сяду поудобнее и начну ждать :)

>а если менять везде по твоим примерам, да еще учитывая тот код
>что ты привел.
>можно попробовать сделать так:

...
а если так


... href="http://a:b:c:d" ...
... href="http://a:b:c" ...
... href="http://a:b" ...
... href="http://a" ...

;-)
Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

9. "sed/perl замена символов в найденной построке"  
Сообщение от madskull (??) on 26-Май-08, 15:02 
>>>Но может суровые бородатые перлачи напишут perl-однострочник :-)
>>
>>не знаю может быть и напишут, ты подожди :)
>
>Сейчас, сяду поудобнее и начну ждать :)
>

а что, обязательно однострочник? ну вот, жалкая попытка:
perl -wlne 's#( (?:style|src|href)="(?:http://|ftp://)?)(.+?)(")#$1.&{sub{($a=$_[0])=~s,:,/,g;$a}}($2).$3#gei;print' file

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

11. "sed/perl замена символов в найденной построке"  
Сообщение от devcoder (ok) on 26-Май-08, 15:17 
>а что, обязательно однострочник?

Необязательно, мой код на awk нормально отрабатывает,
просто хотелось ужаснуться восхищёнными глазами :-)

> ну вот, жалкая попытка:
>perl -wlne 's#( (?:style|src|href)="(?:http://|ftp://)?)(.+?)(")#$1.&{sub{($a=$_[0])=~s,:,/,g;$a}}($2).$3#gei;print' file

Не работает.

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

12. "sed/perl замена символов в найденной построке"  
Сообщение от madskull (??) on 26-Май-08, 15:49 
>Не работает.

Странно
у меня работает


[arena tmp]$ cat file
<a style="a:b;" href="a:b:c:d" style="c:d;">
<img style="a:b;" src="a:b:c:d" style="c:d;">
<a style="a:b;" href="a:b:c:d" style="c:d;"><img style="a:b;" src="a:b:c:d" style="c:d;">
<a style="a:b;" href="http://a:b:c:d" style="c:d;">

[arena tmp]$ perl -wlne 's#( (?:style|src|href)="(?:http://|ftp://)?)(.+?)(")#$1.&{sub{($a=$_[0])=~s,:,/,g;$a}}($2).$3#gei;print' file
<a style="a/b;" href="a/b/c/d" style="c/d;">
<img style="a/b;" src="a/b/c/d" style="c/d;">
<a style="a/b;" href="a/b/c/d" style="c/d;"><img style="a/b;" src="a/b/c/d" style="c/d;">
<a style="a/b;" href="http://a/b/c/d" style="c/d;">

[arena tmp]$

Или, может, я что-то не понял?

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

13. "sed/perl замена символов в найденной построке"  
Сообщение от devcoder (ok) on 26-Май-08, 16:00 
>>Не работает.
>
>Странно у меня работает

Всё так, это что-то у меня.
Супер.

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

Архив | Удалить

Индекс форумов | Темы | Пред. тема | След. тема
Оцените тред (1=ужас, 5=супер)? [ 1 | 2 | 3 | 4 | 5 ] [Рекомендовать для помещения в FAQ]




Спонсоры:
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2021 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру