Using sed or awk

I have a .txt file with almost few hundreds interfaces address which need to be changed or mapped to the new interface naming convention. for e.g interface

xe-8/0/0 should be xe-16/0/0
xe-9/0/0 should be xe-17/0/0
it keeps going to xe-31/0/0 which should become xe-55/0/0.

i wanted to know how can i change to new naming convention using sed or awk or any other method?

appreciate any feedback.

Awk is probably the most suited for the need.

You should give more details about what the original file looks like.

I don't get it. The first two examples add 8 to the old name to get the new name. The last example adds 24??? Maybe you need to better explain the old and new naming conventions better.

Arithmetic and sed do not get along, but what is your naming algorythm? You went from +8 to +24. Consider ksh/bash, too.

Call me crazy, but this progression works in bash (integer math).

for xx in {8..31};
do
    if [ $xx -lt 10 ]; then
        echo "$(( $xx + 8 ))"
    else
        echo "$(( $xx + ( $xx / 10 * 8 )))"     ## int($xx/10)
    fi
done

i will try this later. thanks

Below is the snipet from configuration , as you can see :
xe-0/0/0 need to change it to xe-8/0/0.

set interfaces xe-0/0/0 
set interfaces xe-0/0/0 hold-time up 2000
set interfaces xe-0/0/0 hold-time down 0
set interfaces xe-0/0/0 gigether-options 802.3ad ae10
set interfaces xe-0/0/1 description DO-NOT-USE
set interfaces xe-0/0/2 description test
set interfaces xe-0/0/2 hold-time up 1000
set interfaces xe-0/0/2 hold-time down 0
set interfaces xe-0/0/2 unit 0 family inet filter input ingrees tea
set interfaces xe-0/0/2 unit 0 family inet address 1.1.1.1/30
set interfaces xe-0/0/3 description "Test"
set interfaces xe-0/0/3 hold-time up 1000
set interfaces xe-0/0/3 hold-time down 0
set interfaces xe-0/0/3 unit 0 family inet filter input INGRESS_SAMPLE
set interfaces xe-0/0/3 unit 0 family inet address 2.2.2.1/31
set interfaces xe-0/0/4 description "xe-0/0/1"
set interfaces xe-0/0/4 hold-time up 1000
set interfaces xe-0/0/4 hold-time down 0
set interfaces xe-0/0/4 gigether-options 802.3ad ae12
set interfaces xe-0/0/5 description DO-NOT-USE
set interfaces xe-0/0/6 description "Test"
set interfaces xe-0/0/6 hold-time up 1000
set interfaces xe-0/0/6 hold-time down 0

---------- Post updated at 07:36 PM ---------- Previous update was at 06:28 PM ----------

i am sorry guys, i need to do this in code....here you go guys.

set interfaces xe-0/0/0 set interfaces xe-0/0/0 hold-time up 2000 set interfaces xe-0/0/0 hold-time down 0 set interfaces xe-0/0/0 gigether-options 802.3ad ae10 set interfaces xe-0/0/1 description DO-NOT-USE set interfaces xe-0/0/2 description test set interfaces xe-0/0/2 hold-time up 1000 set interfaces xe-0/0/2 hold-time down 0 set interfaces xe-0/0/2 unit 0 family inet filter input ingrees tea set interfaces xe-0/0/2 unit 0 family inet address 1.1.1.1/30 set interfaces xe-0/0/3 description "Test" set interfaces xe-0/0/3 hold-time up 1000 set interfaces xe-0/0/3 hold-time down 0 set interfaces xe-0/0/3 unit 0 family inet filter input INGRESS_SAMPLE set interfaces xe-0/0/3 unit 0 family inet address 2.2.2.1/31 set interfaces xe-0/0/4 description "xe-0/0/1" set interfaces xe-0/0/4 hold-time up 1000 set interfaces xe-0/0/4 hold-time down 0 set interfaces xe-0/0/4 gigether-options 802.3ad ae12 set interfaces xe-0/0/5 description DO-NOT-USE set interfaces xe-0/0/6 description "Test" set interfaces xe-0/0/6 hold-time up 1000 set interfaces xe-0/0/6 hold-time down 0

I give up. I see ABSOLUTELY nothing in any of the above that explains why:

  1. xe-8/0/0 should be xe-16/0/0,
  2. xe-9/0/0 should be xe-17/0/0, nor
  3. xe-31/0/0 which should become xe-55/0/0

as requested in your 1st post in this thread since none of xe-8/0/0 , xe-9/0/0 , xe-16/0/0 , xe-17/0/0 , xe-31/0/0 , nor xe-55/0/0 appear in the above message.

You say you need to convert from one naming convention to another naming convention and tell us nothing about either naming convention. If you want help doing this you need to explain both naming conventions and the logic behind converting from the old convention to the new convention.

I doubt this will be much good, but it's all I've come up with that will produce set interfaces xe-55 in the end. I'm still not clear on what the OP has in mind??

while read yy
do
    set $yy
    bb=${3#*-} 
    aa=${bb%%/*}
    if [ $aa -lt 10 ];then
        dd=$(( $aa + 8 ))
    else
        dd=$(( $aa + ( $aa / 10 * 8 )))
    fi
    echo $yy | sed -e "s|xe-[0-9]*|xe-$dd|"
done < series.data

# output
# ------
# set interfaces xe-16/0/0
# set interfaces xe-19/0/0 hold-time up 2000
# set interfaces xe-37/0/0 hold-time down 0
# set interfaces xe-54/0/0 gigether-options 802.3ad ae10
# set interfaces xe-55/0/1 description DO-NOT-USE
# set interfaces xe-8/0/2 description test

Using this for a data set

set interfaces xe-8/0/0
set interfaces xe-11/0/0 hold-time up 2000
set interfaces xe-21/0/0 hold-time down 0
set interfaces xe-30/0/0 gigether-options 802.3ad ae10
set interfaces xe-31/0/1 description DO-NOT-USE
set interfaces xe-0/0/2 description test

i am trying to replace multiple xe- numbers by using the below sed commands. but i like to know if there is any easy way to do it instead the one i am using.

sed -e 's/xe-36/xe-41/g' -e 's/xe-37/xe-51/g' -e 's/xe-38/xe-61/g' <file name>

any help will be appreciated.

---------- Post updated at 08:20 AM ---------- Previous update was at 08:12 AM ----------

guys thanks for your help and patience. wanted to make sure if there is any other easy way of replacing it without mentioning each (xe-) number? using awk or sed?

let me do it again with the correct method.

 sed -e 's/xe-36/xe-41/g' -e 's/xe-37/xe-51/g' -e 's/xe-38/xe-61/g' testing123

I doubt it doable unless you provide an algorithm or a translation table that gives us the target numbers from the original ones.

Hi ,

I agree it may not be doable but here is the number you requested.

xe-8/ >xe-16/
xe-9=17
xe-10=18
xe-11=19
xe-12=20
xe-13=21
xe-14=22
xe-15=23
xe-16=32
xe-17=33

thanks!

Modify your translation table like so

xe-0    xe-8
xe-8    xe-16
xe-9    xe-17
xe-10   xe-18
xe-11   xe-19
xe-12   xe-20
xe-13   xe-21
xe-14   xe-22
xe-15   xe-23
xe-16   xe-32
xe-17   xe-33

and try

awk     'NR==FNR        {T[$1]=$2; next}
                        {split ($3, X, "/")
                         if (X[1] in T) sub(X[1], T[X[1]], $3)
                        }
         1
        '  trtable file