echo 'Marker11234567890Marker2' | grep -Po '(?<=Marker1).*(?=Marker2)' # tulostaa tekstin joka on hakuavaimien välissä - 
                                                                       # jos kumpaakin avainta ei ole niin mitään ei tulostu
echo 'Marker11234567890Marker2' | grep -Po '(?<=Marker1).*'            # tulostaa tekstin joka on hakuavaimen edessä -
                                                                       # jos avainta ei ole niin mitään ei tulostu
echo 'Marker11234567890Marker2' | grep -Po '.*(?=Marker2)'             # tulostaa tekstin joka on hakuavaimen perässä -
                                                                       # jos avainta ei ole niin mitään ei tulostu

merkkijono='apupappi'; echo ${#merkkijono}       # tulostaa: 8 (matriisin jäsenien kukumäärä) (BASH:in len-funktio)
merkkijono='apupappi'; echo ${merkkijono:2}      # tulostaa: upappi
merkkijono='apupappi'; echo ${merkkijono:2:4}    # tulostaa: upap # vakiot 2 ja 4 voivat olla muuttujiakin: echo ${merkkijono:$alku:$pituus} 
merkkijono='apupappi'; echo ${merkkijono:%?}     # tulostaa: apupapp  
merkkijono='apupappi'; echo ${merkkijono: -3}    # tulostaa: ppi
merkkijono='apupappi'; echo ${merkkijono::-3}    # tulostaa: apupa
merkkijono='apupappi'; echo ${merkkijono%u*}     # tulostaa: ap
merkkijono='apupappi'; echo ${merkkijono%p*}     # tulostaa: apupap
merkkijono='apupappi'; echo ${merkkijono%%p*}    # tulostaa: a
merkkijono='apupappi'; echo ${merkkijono##*p}    # tulostaa: i
merkkijono='apuxpappi'; echo ${merkkijono%xp*}   # tulostaa: apu -> siis myös etsittävä voi olla merkkijono
merkkijono='apupappu'; echo ${merkkijono//pu/sik} # tulostaa: asikpapsik -> siis korvaava ja korvattava voivat olla eripitkiä 
merkkijono='apupappu'; echo ${merkkijono/%pu/sik} # tulostaa: apupapsik elikä: %->vain viimeinen korvataan
merkkijono='9 8 7 5 4'; echo ${merkkijono%% *}   # tulostaa: 9        
merkkijono='9 8 7 5 4'; echo ${merkkijono% *}    # tulostaa: 9 8 7 5 
merkkijono='9 8 7 5 4'; echo ${merkkijono##* }   # tulostaa: 4
merkkijono='9 8 7 5 4'; echo ${merkkijono#* }    # tulostaa: 8 7 5 4
merkkijono=xxxabyyy; echo ${merkkijono//ab/acc}  # tulostaa: xxxaccyy -> siis korvaava ja korvattava voivat olla eripitkiä 
merkkijono="12345"; echo ${merkkijono%?}         # tulostaa: 1234; %-># poistaa ensimmäisen merkin
merkkijono=""; echo ${merkkijono:-foo}           # tulostaa: foo sillä foo on oletusarvo
merkkijono=""; foo="alussa kiitos seisoo"; echo ${merkkijono:-$foo} # tulostaa: alussa kiitos seisoo - oletusarvo voi olla muuttujakin

merkkijono=lllll.; echo ${merkkijono%*.}         # tulostaa lllll elikä poistaa pisteen perästä jos siinä on
merkkijono=.lllll; echo ${merkkijono#.*}         # tulostaa lllll elikä poistaa pisteen alusta jos siinä on 
merkkijono=+1 ; echo ${merkkijono#[-+]}          # tulostaa 1 - poistaa alusta minkähyvänsä luetelluista merkeista
merkkijoo=aaaBBBccc; echo ${merkkijono^^}        # tulostaa AAABBBCCC
merkkijoo=aaaBBBccc; echo ${merkkijono,,}        # tulostaa aaabbbccc

merkkijono='a,b b b,c'; echo $merkkijono | sed -e s/,/\'" "\'/g  -e s/^/\(\'/ -e s/$/\'\)/  # tulostaa: ('a' 'b b b' 'c') -> merkkijonosta matriisiksi

merkkijono='sdsdfadliuhihilHEFIHBFibfhx xgfcvjvjhvhvyy234'; echo ${merkkijono#*x xg*yy}   # tulostaa 234 ;  elikä merkkijonon "x xg<jokerimerkki *>yy" jälkeinen. Mikäli jompaakumpaa merkkijonoa ei löydy tulostetaan koko merkkijono. 

merkkijono='aa bb'; echo $merkkijono | tr a-z A-Z | tr " " "_" # tulostaa: AA_BB

montako=9; echo "command lines" | rev | cut -c $(($montako+1))- | rev    # tulostaa: comm

a='<title>coconut tree</title>'; [[ "$a" =~ \<title\>(.*?)\</title\> ]] && set -- ${BASH_REMATCH[1]}; echo $1 '*****' $2
 
Tekstijono jossa on sama merkki toistettuna monta kertaa (repeat-string):
RivinPituus=$(tput cols); PuolenRivinpituudeltaPlussia=$(eval printf '+%.s' {1..$(($RivinPituus/2))}); echo $PuolenRivinpituudeltaPlussia
- kone laskee Rivinpituuden oikein huolimatta siitä millainen näyttö on mutta ottaen huomioon mikä on ikkunan koko. 
- tästä on sitten hyvä karsia; esimerkiksi kuinka tulostat perättäisiä plussia tai pikkuisella muutoksella mitähyvänsä: printf '+%.s' {1..55}
- kuitenkin perättäiset miinukset: printf -- '-%.s' {1..55} ja perättäiset jakoviivat:  printf "/%.s" {1..55} -> siis lainausmerkit kovista pehmeiksi 

Tekstijonosta otetaan palanen seuraavasti:
Tekstijono="onomatopoeettinen"; palanalku=3; palanpituus=4; Palanen=$(echo ${Tekstijono:$palanalku:$palanpituus}); echo $Palanen    
- tai: Tekstijono="onomatopoeettinen"; palanalku=3; palanloppu=7; Palanen=$(echo ${Tekstijono:$palanalku:$(($palanloppu-$palanalku))}); echo $Palanen

mikäli apuuu:n viimeinen merkki ei ole ] niin lisätään sinne ]:  [[ ${apuu:${#apuuu}-1} != ] ]] && apuu=$apuuu"]" 

tulos="log[11-2*sin30]+ln[e^2]" ;apu=$(echo "$tulos" | grep -Po  "\[.*\]");echo -n $apu # ensimmäisestä [ merkistä viimeiseen ] merkkiin.



$(echo $lause | grep -Pow '(?:tan.*)') # lause tekstijonosta tan alkaen

tulos="123.456789"; desimaaleja=2;[[ $(echo $tulos | grep "\.") ]] && ( echo -n ${tulos%.*}; echo -n "."; apu=${tulos#*.}; echo ${apu:0:$desimaaleja} ) || echo $tulos   # tulostaa: kokonaisosa.desimaaleja määrän desimaaleja. Jos pistettä ei ole niin koko tulos tulostetaan     # kannattaisikohan pyöristys ja loppunollien poisto ?

[[ ...]] välissä ei tarvitse välilyöntejä sisältävää sanaa kirjoittaa sulkuihin.

merkkijono=$(cat /dev/urandom | base64 | head -c merkkimäärä)  # satunnaisen merkkijonon tulostaminen  
**
Koneesi ipv6-osoitteet saat käskyllä
ip -6 addr
Kun saat käsiisi jotain jonka pitäisi olla ipv6-osoite voit testata sen käskyllä:
function ipv6testi () { [[ $(echo $1|tr -d :/[[:xdigit:]]) = '' && $(echo $1|tr -dc :|wc -c)<7 && $(echo $1|grep -o '[[:xdigit:]]*'| \
wc -L)<5 ]] && echo osoite on kelvollinen || echo osoite on kelvoton ;}; ipv6testi 1::1111:1/128 # esimerkkiosoite

Kyllä ipv6:lle on regex-kin ja sitä kannattaa käyttää, sillä se on nopeakin:
echo 1:1:1:1:1:1:1:1111 | grep -P "^\s*((([0-9A-Fa-f]{1,4}:){7}([0-9A-Fa-f]{1,4}|:))|(([0-9A-Fa-f]{1,4}:){6}(:[0-9A-Fa-f]{1,4}|((25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])(\.(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])){3})|:))|(([0-9A-Fa-f]{1,4}:){5}(((:[0-9A-Fa-f]{1,4}){1,2})|:((25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])(\.(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])){3})|:))|(([0-9A-Fa-f]{1,4}:){4}(((:[0-9A-Fa-f]{1,4}){1,3})|((:[0-9A-Fa-f]{1,4})?:((25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])(\.(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])){3}))|:))|(([0-9A-Fa-f]{1,4}:){3}(((:[0-9A-Fa-f]{1,4}){1,4})|((:[0-9A-Fa-f]{1,4}){0,2}:((25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])(\.(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])){3}))|:))|(([0-9A-Fa-f]{1,4}:){2}(((:[0-9A-Fa-f]{1,4}){1,5})|((:[0-9A-Fa-f]{1,4}){0,3}:((25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])(\.(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])){3}))|:))|(([0-9A-Fa-f]{1,4}:){1}(((:[0-9A-Fa-f]{1,4}){1,6})|((:[0-9A-Fa-f]{1,4}){0,4}:((25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])(\.(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])){3}))|:))|(:(((:[0-9A-Fa-f]{1,4}){1,7})|((:[0-9A-Fa-f]{1,4}){0,5}:((25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])(\.(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])){3}))|:)))(%.+)?\s*$" 



