2013-12-01 2 views
0

Я пытаюсь заменить числа от -20 до 30 с помощью sed, но он добавляет символ «v». Что не так?Замена чисел на SED

Например: SINR = -18, выход должен быть «c», но выход «vc». Я попытался удалить 1-й символ, но он возвращает 1 вместо j.

SINR=`curl -s http://10.0.0.1/status | awk '/3GPP.SINR=/ {print $0}' | awk -F "3GPP.SINR=" '{print $2}'` # returns number 
echo $SINR | sed "s/-20/a/;s/-19/b/;s/-18/c/;s/-17/d/;s/-16/e/;s/-15/f/;s/-14/g/;s/-13/h/;s/-12/i/;s/-11/j/;s/-10/k/;s/-9/l/;s/-8/m/;s/-7/n/;s/-6/o/;s/-5/p/;s/-4/q/;s/-3/r/;s/-2/s/;s/-1/t/;s/0/u/;s/1/v/;s/2/w/;s/3/x/;s/4/y/;s/5/z/;s/6/A/;s/7/B/;s/8/C/;s/9/D/;s/10/E/;s/11/F/;s/12/G/;s/13/H/;s/14/I/;s/15/J/;s/16/K/;s/17/L/;s/18/M/;s/19/N/;s/20/O/;s/21/P/;s/22/Q/;s/23/R/;s/24/S/;s/25/T/;s/26/U/;s/27/V/;s/28/W/;s/29/X/;s/30/Y/" 
+0

Какой выход из 'свернуться -s HTTP: // 10.0.0.1/status' и что вы хотели бы иметь в качестве выхода из 'sed'command? – Jotne

+0

@Jotne SINR = номер. Число от -20 до 30. Мне нравится иметь «a» вместо -20, «b» вместо -19 и т. Д. – rdshck

+0

Когда SINR = -18, вывод этой команды sed «c» в моей системе , Я подозреваю, что здесь есть какая-то другая проблема, например, возможно, что SINR получает дополнительно 1 к ней. –

ответ

5

Этот способ будет более изящным и менее подвержен ошибкам:

echo $SINR | awk 'BEGIN { chars="abcdefg" } { print substr(chars, $1 + 21, 1) }' 

Конечно, chars должен содержать все буквы, необходимые для отображения. То есть, вплоть до ...VWXY, как в вашем примере, я только что написал до g, чтобы держать его коротким и сладким.

С помощью этого решения ваша проблема исчезает.

2

Если у вас есть процесс отображения, вы, безусловно, лучше строить switch заявления, пара if-х, или даже с помощью Баша associative arrays (Баша> = 4,0). Например, вы могли бы решить проблему с помощью следующего фрагмента кода:

function mapper() { 

    if [[ $1 -ge -20 && $1 -le 5 ]]; then 
     printf \\$(printf '%03o' $(($1 + 117))) 
    elif [[ $1 -ge 6 && $1 -le 30 ]]; then 
     printf \\$(printf '%03o' $(($1 + 59))) 
    else 
     echo ""; return 1 
    fi 
    return 0 

} 

и использовать, как показано ниже:

$ mapper -20 
a 
$ mapper 5 
z 
$ mapper 6 
A 
$ mapper 30 
Y 
$ mapper $SINR 
c 
4

Вы действительно не нуждаетесь в СЭД или AWK, если у вас есть Баш, как вы говорите, что вы делаете , Вы можете использовать массивы, которые, может быть, даже меньше подвержены ошибкам ;-)

map=({a..z} {A..Z}) # Create map of your characters 
SINR=-18    # Set your SINR number to something 
SINR=$(($SINR+20))  # Add an offset to get to right place 
result=${map[$SINR]} # Lookup your result 
echo $result   # Print it 
c 
0
echo "${SINR}" | sed 's/-20/a/;t;s/-19/b/;t;s/-18/c/;t;s/-17/d/;t;s/-16/e/;t;s/-15/f/;t;s/-14/g/;t;s/-13/h/;t;s/-12/i/;t;s/-11/j/;t;s/-10/k/;t;s/-9/l/;t;s/-8/m/;t;s/-7/n/;t;s/-6/o/;t;s/-5/p/;t;s/-4/q/;t;s/-3/r/;t;s/-2/s/;t;s/-1/t/;t;s/0/u/;t;s/1/v/;t;s/2/w/;t;s/3/x/;t;s/4/y/;t;s/5/z/;t;s/6/A/;t;s/7/B/;t;s/8/C/;t;s/9/D/;t;s/10/E/;t;s/11/F/;t;s/12/G/;t;s/13/H/;t;s/14/I/;t;s/15/J/;t;s/16/K/;t;s/17/L/;t;s/18/M/;t;s/19/N/;t;s/20/O/;t;s/21/P/;t;s/22/Q/;t;s/23/R/;t;s/24/S/;t;s/25/T/;t;s/26/U/;t;s/27/V/;t;s/28/W/;t;s/29/X/;t;s/30/Y/' 

Используйте т после того, как с // ускорить немного.

ВХ не встречающийся нормально, если ОСШ просто номер, как указано

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