URL: https://www.opennet.ru/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 7381
[ Назад ]

Исходное сообщение
"sed/perl замена символов в найденной построке"

Отправлено devcoder , 24-Май-08 13:58 
Привет всем.
Есть строка вида
<a href="a:b:c:d" ...
нужно получить
<a href="a/b/c/d" ...

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

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


Содержание

Сообщения в этом обсуждении
"sed/perl замена символов в найденной построке"
Отправлено L0n3R4ng3r , 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


"sed/perl замена символов в найденной построке"
Отправлено dev_coder , 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'

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


"sed/perl замена символов в найденной построке"
Отправлено macss , 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


"sed/perl замена символов в найденной построке"
Отправлено macss , 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


"sed/perl замена символов в найденной построке"
Отправлено madskull , 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

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


"sed/perl замена символов в найденной построке"
Отправлено NuINu , 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");


"sed/perl замена символов в найденной построке"
Отправлено devcoder , 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
       }'
}


"sed/perl замена символов в найденной построке"
Отправлено NuINu , 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");
}

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


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

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

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

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

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

...
а если так


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

;-)

"sed/perl замена символов в найденной построке"
Отправлено madskull , 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


"sed/perl замена символов в найденной построке"
Отправлено devcoder , 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

Не работает.


"sed/perl замена символов в найденной построке"
Отправлено madskull , 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]$

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


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

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