LINUX.ORG.RU

Сложный крнвейер как редактор потока


0

1

Прошу помощи у бывалых с awk (или sed)! Задачка не тривиальная - обработка потока особым образом. Уже имеется сложная конструкция:

cat | egrep -o "[некоторое значеие ~a~ или ~b~]" | egrep "[что-то связаное с ~b~]" | \
awk '/~b~/ {i++; x[i]=$1} /~a~/ {y=sprintf("%s %s",$3,$4)} END {for (j=1; j<=i; j++) printf("%s %s %s\n", y, x[j], x[j])}' | \
sed 'тут всё сложно - обрабатываеются URL' | tr "устраняет негатив предыдущего sed" | sed "поместить 2 фигни в начало каждой строки"
И результат её работы имеет следующий вид:

фигня_1 фигня_2 фигня_3 фигня_4 элемент_1 "элемент_2"

И задача, собственно, вот в чём... Внутри элемент_2 (это URL), спрятан элемент_1 (например, имя файла). Проблема в том, что элемент_1 записан в web-hex, то есть %=%25, '\s'=%20 и так далее. Это делает его частично или полностью нечитаемым. Для приведения этого фрагмента строки в порядок я хочу использовать два раза подряд конструкцию вида:

элемент_1=`echo -e \`echo элемент | sed 'заменить % на \x'\``
По идее это должно превратить %ХХ в понятный для echo вид \xAA, который преобразуется в нужный символ, если указан "-е". Помогите дописать редактор.

★★

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

AITap ★★★★★
()

элемент_1=`echo -e \`echo элемент | sed 'заменить % на \x'\``

| while read -r a b c d e; do b=`echo ...` ...; done

anonymous
()
Ответ на: комментарий от anonymous

Не совсем точно, но почти гениально! И как сам не додумался!...

zzdnx ★★
() автор топика
Ответ на: комментарий от AITap

Пёрла ещё не знаю, потому не хочу его трогать, а просить готового решения на нём так же не хочется по причине того что не буду понимать что там написано уже через `random time`...

zzdnx ★★
() автор топика
Ответ на: комментарий от anonymous
a='1 2 3 4 file_name_is_%257b "http://site/%257b%257b%257b"'

echo $a | while read -r a b c d e f ; do e=`echo -e "$e" | sed 's/%/\\\\\x/g'` ; echo -e $a $b $c $d `echo -e "$e" | sed 's/%/\\\\\x/g'` $f ; done

1 2 3 4 file_name_is_{ "http://site/%257b%257b%257b"
zzdnx ★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.