Když už bash má nástroje na jednoduchou substituci ${PROM/
/patter/replace}
je možné je využít i těmito způsoby? Tedy bez použití externích programů, ale přímo bashem. Důraz je, aby ty příkazy nebyla nějak roztahané, aby ta substituce byla přímo u řetězce či příkazu $(příkaz)
$"řetězec"//a/b $(uname)/
Na první řádku je schematický zápis (který samozřejmě nefunguje), resp intutitivně jak bych to zapsal., na druhé řádku je výstup, na třetím je jak dané věci dosáhnout existující syntaxí (trochu hack).
# 1)
echo "# Ema má mámu"/mu/slo
# Ema má máslo
(PROM="aabc"; ls ; echo ${PROM/a/_} ; ls)
# nevýhoda: příkaz pro substituci není přímo u echa, tudíž to znepřehlednuje
# 2)
echo "je rok $(date)##* /"
(JAR=`date`; echo ${JAR##* })
#2020 (hodně ohnutá syntaxe pattern matchingu)
PROM="Kamen 1234"
echo ${VAR/2/j%%[0-9]}
Kamen 1j
Poslední příklad je řetězení substituce a suffix removing
Zajímalo by mě, jak moc to umí plnohodnoté regexp.
Dál by mě zajímalo proč nefunguje
echo ${P//[:word:]/_} (případně digit)- ačkoli
echo ${P//[a-z]/_} - chová se to tak že místo třídy znaků to matchne jeden z
: d i g tDál, že nejdou složitější regexpy
echo ${JAR#[^0-9]+}
-nejde tam u třídy znaků dát operátor opakování ?+* nebo {rozsah}
A také, zda substituce ${//replace umí v replace části $1 nebo \1 reference na captured části... $0 to nahrazuje za "bash"
Dál by mě zajímalo jestli když existují
${parameter#word} ${parameter##word} Remove matching
prefix pattern a suffix
zda existuje něco jako JEN PATTERn MATCH a PATTERN MATCH REMOVE
PROM=abcde7fgh
echo ${PROM~[0-9]}
==> 7
PROM=abcd12ef3sdfsd45
echo ${PROM??[0-9][0-9]}
==> abcdef3sdsd
# (smaže výskyt dvou číslic (mírně nepřesné))
==> 7