Привет всем.
Есть строка вида
<a href="a:b:c:d" ...
нужно получить
<a href="a/b/c/d" ...Простая замена в стиле tr не подойдёт,
так как вне найденной подстроки
менять символы нельзя.Желательно на sed или perl.
>[оверквотинг удален]
>Есть строка вида
><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
Не прокатит, так как строка может быть
<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'Только адаптировать под свой пример не получается :-(
>[оверквотинг удален]
>Есть строка вида
><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
>[оверквотинг удален]
>>нужно получить
>><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 -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Спасибо, повеселил :)
>[оверквотинг удален]
>Есть строка вида
><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");
Это было бы легко, но строки могут быть такие:
<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
}'
}
>Это было бы легко, но строки могут быть такие:
>
><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");
}а уж однострочник ты сам делай. ну и поиск пробелов я не делал, ведь в примерах и нет, не обессудь.
>ну так ты сразу пиши чего хочешь.:-) я бы до сих пор комбинации набивал
>>
>>Ниже, то что я родил на awk, работает.
>>Но может суровые бородатые перлачи напишут perl-однострочник :-)
>
>не знаю может быть и напишут, ты подожди :)Сейчас, сяду поудобнее и начну ждать :)
>а если менять везде по твоим примерам, да еще учитывая тот код
>что ты привел.
>можно попробовать сделать так:...
а если так
... href="http://a:b:c:d" ...
... href="http://a:b:c" ...
... href="http://a:b" ...
... href="http://a" ...
;-)
>>>Но может суровые бородатые перлачи напишут perl-однострочник :-)
>>
>>не знаю может быть и напишут, ты подожди :)
>
>Сейчас, сяду поудобнее и начну ждать :)
>а что, обязательно однострочник? ну вот, жалкая попытка:
perl -wlne 's#( (?:style|src|href)="(?:http://|ftp://)?)(.+?)(")#$1.&{sub{($a=$_[0])=~s,:,/,g;$a}}($2).$3#gei;print' file
>а что, обязательно однострочник?Необязательно, мой код на awk нормально отрабатывает,
просто хотелось ужаснуться восхищёнными глазами :-)> ну вот, жалкая попытка:
>perl -wlne 's#( (?:style|src|href)="(?:http://|ftp://)?)(.+?)(")#$1.&{sub{($a=$_[0])=~s,:,/,g;$a}}($2).$3#gei;print' fileНе работает.
>Не работает.Странно
у меня работает
[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]$
Или, может, я что-то не понял?
>>Не работает.
>
>Странно у меня работаетВсё так, это что-то у меня.
Супер.