1

Temat: Manipulacje na stringach w Openwrt

Pisząc własne skrypty często musimy obrabiać w jakiś sposób ciągi liter. Można do tego celu użyć programów awk/sed/cut/grep itd, ale należy pamiętać że wbudowany shell tez posiada pewne możliwości w tym zakresie.

root@OpenWrt:~# export TEST=12345678901234567890

Długość stringu

root@OpenWrt:~# echo ${#TEST}
20

Wycinane znaków od pozycji z lewej strony (liczone jest od zera!)

root@OpenWrt:~# echo ${TEST:0}
12345678901234567890
root@OpenWrt:~# echo ${TEST:1}
2345678901234567890
root@OpenWrt:~# echo ${TEST:4}
5678901234567890

Dodanie jeszcze jednego parametru określi liczbę znaków:

root@OpenWrt:~# echo ${TEST:4:2}
56

Wycinane znaków od prawej strony

root@OpenWrt:~# echo ${TEST%?}
1234567890123456789
root@OpenWrt:~# echo ${TEST%??}
123456789012345678
root@OpenWrt:~# echo ${TEST%???}
12345678901234567

Wycinanie ciągu bazując na wyrażeniach (najkrótsze dopasowanie)
Wszystko od początku do znaku 4:

root@OpenWrt:~# echo ${TEST#*4}
5678901234567890

Wszystko od znaku 4 do końca:

root@OpenWrt:~# echo ${TEST%4*}
1234567890123

Wycinanie ciągu bazując na wyrażeniach (najdłuższe dopasowanie)
Wszystko od znaku "4" (znaku, nie pozycji) do końca:

root@OpenWrt:~# echo ${TEST##*4}
567890

Wszystko od początku do znaku "4"(znaku, nie pozycji) :

root@OpenWrt:~# echo ${TEST%%4*}
123

Zamiana znaków:
Jednokrotne wystąpienie:

root@OpenWrt:~# echo ${TEST/45/!!}
123!!678901234567890

Wszystkie wystąpienia:

root@OpenWrt:~# echo ${TEST//45/!!}
123!!67890123!!67890

Pamiętajmy też o możliwości wyrażeń

root@OpenWrt:~# echo ${TEST/4*5/!!}
123!!67890

root@OpenWrt:~# export TEST=/dev/ttyUSB4
root@OpenWrt:~# echo ${TEST#/dev/}
ttyUSB4
root@OpenWrt:~# echo ${TEST##*/}
ttyUSB4
root@OpenWrt:~# echo ${TEST%%[0-9]}
/dev/ttyUSB

Parę innych przykładów:

root@OpenWrt:~# A="1/2/3/4"; echo ${A#*/}
2/3/4
root@OpenWrt:~# A="1/2/3/4"; echo ${A##*/}
4
root@OpenWrt:~# A="1/2/3/4/"; echo ${A##*/}

root@OpenWrt:~# A="1/2/3/4"; echo ${A##*3}
/4
root@OpenWrt:~# A="1/2/3/4"; echo ${A%%3*}
1/2/

root@OpenWrt:~# A="/dev/ttyUSB0"; echo ${A#*/}
dev/ttyUSB0
root@OpenWrt:~# A="/dev/ttyUSB0"; echo ${A##*/}
ttyUSB0
root@OpenWrt:~# A="/dev/ttyUSB0"; echo ${A##*0}

root@OpenWrt:~# A="/dev/ttyUSB0"; echo ${A##*USB}
0
root@OpenWrt:~# A="/dev/ttyUSB0"; echo ${A%%0*}
/dev/ttyUSB
root@OpenWrt:~# A="/dev/ttyUSB0"; echo ${A%%[0-9]*}
/dev/ttyUSB
Masz niepotrzebny router, uszkodzony czy nie - chętnie przygarnę go.