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