2014-11-14 2 views
0

У меня есть сценарий, где я echo несколько строк и pipe их переводчик, как это:Задержка расширения переменного в Баше

echo -n ' 
$error This is an error$defaults 
$fatal THIS IS FATAL ERROR$defaults 
This is normal text 
' | translate ansi 

echo -n ' 
$error This is an error$defaults 
$fatal THIS IS FATAL ERROR$defaults 
This is normal text 
' | translate html 

я впервые использовал sed заменить ansi с html кодами, но из-за очевидные Я хотел бы сделать что-то вроде этого:

input="$(cat)" 
if [ "$1" == ansi ] 
then 
    error="[1m[31m" 
    fatal="[0m[30m[41m" 
    defaults="[0m" 
elif [ "$1" == html ] 
then 
    error='<span class="error">' 
    fatal='<span class="fatal">' 
    defaults='</span>' 
fi 
eval "echo "$input"" 

Но выход находится в одной строке. Я экспериментировал с ${} и cat << трюками, но ни один из экспериментов дал мне желаемый результат.

+0

Почему вы используете 'eval'? –

+0

подсветка синтаксиса должен показать вам проблему на' eval' line – choroba

+0

@ Etan Reisner - так как 'echo' и' HEREDOC' потерпели неудачу, я пробовал это, и он почти сработал. @choroba - Я знаю, что использование таких котировок неверно, но все остальные комбинации одиночных или/или двойные кавычки дают мне ошибку 'строка 15: $ '\ E [1m \ E [31m': команда не найдена – Ulrik

ответ

1
eval "echo \"$(echo "${input}")\"" 

, но почему бы не непосредственно СЭД (здесь с помощью имени переменной и содержания путем замещения

cat > | sed "s/\$error/${error}/g;s/\$fatal/${fatal}/g;s#\$defaults#${defaults}#g' 
+0

Вы оба Спасибо, отлично, спасибо. Я не вижу существенной разницы в скорости между подстановкой 'sed' и переменной' eval'uation (я говорю о 'cat'enating огромных файлах). – Ulrik

+0

, если вы знаете имя файла вместо того, чтобы отправлять его как поток через несколько кошек, использовали имя файла непосредственно в sed (последний аргумент), а не кошку вообще. Это должно быть быстрее избегать нескольких кошек + shell fork + временный внутренний файл – NeronLeVelu

Смежные вопросы