2013-06-26 3 views
2

Любая идея, как можно взять строку типа:Bash строки форматирования

string=1,2,3,4,5 

и используя

number=4 

положить

<font color='red'><b></b></font> 

вокруг соответствующего числа, так что конечный продукт:

newstring=1,2,3,<font color='red'><b>4</b></font>,5 

Спасибо за помощь

+1

ли 'число = 4' относится к точному соответствию в' string' или четвертое поле строки? Что, если 'string = a, b, c, d, e' и' number = 4'? –

ответ

1

Вы можете использовать sed:

result="$(sed "s|\($number\)|<font color='red'><b>\1</b></font>|" <<< "$string")" 

Общая форма: sed s|search pattern|replace| где | некоторый уникальный разделитель (как правило, вы будете использовать / но уже используется в строке для других целей). \(…\) - группа захвата, которая захватывает удар - в данном случае 4 и который может использоваться в строке замены через \1.

+0

Будет проблема в случае 'string = 11,12,1,4' и' number = 1' –

+0

Отличное спасибо! – Atomiklan

0
echo "$string" | sed "s#\(,\|^\)\($number\)\(,\|\$\)#\\1<font color='red'><b>\\2</b></font>\\3#g" 

Должно работать достаточно хорошо в большинстве случаев.

0

Pure bash?

string="1,2,3,4,5" 
num=4 

re="(^|.+,)($num)(,.+|$)" 
if [[ "$string" =~ $re ]] 
then 
    echo -n "${BASH_REMATCH[1]}" 
    echo -n "<font>${BASH_REMATCH[2]}</font>" 
    echo "${BASH_REMATCH[3]}" 
else 
    echo "$num doesn't match" 
fi 

будет производить:

1,2,3,<font>4</font>,5 

или Perl:

echo '1,2,3,4,5' | num=4 perl -F, -lapE '$_=join ",",map{/\b$ENV{num}\b/? "<font>$_</font>":$_}@F' 
+0

что, если 'num = 1'? –

+0

@gniourf_gniourf спасибо - отремонтировано ..;) – jm666