用SED替换数字

时间:2013-12-01 09:53:28

标签: bash sed

我正在尝试使用sed将数字从-20更换为30,但它会添加“v”字符。怎么了?

例如:SINR = -18,输出必须为“c”,但输出为“vc”。 我试图删除第一个字符,但它返回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/"

4 个答案:

答案 0 :(得分:5)

这种方式会更优雅,更不容易出错:

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

当然,chars应该包含映射所需的所有字母。也就是说,直到你的例子...VWXY之前,我一直写到g,以保持简短和甜蜜。

使用此解决方案,您的问题就会消失。

答案 1 :(得分:4)

如果你像你说的那样有bash,你真的不需要sed或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

答案 2 :(得分:2)

如果你有一个映射过程,你最好建立一个switch语句,几个if,甚至使用bash associative arrays(bash> = 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

答案 3 :(得分: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/'

在s //之后使用t加速一点。

如果SINR只是指定的数字

,那么

vc正常发生