Substituce ${VAR/1/2} ale pro přímý řetězec nebo pro výstup příkazu

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).
Kód: [Vybrat]
# 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 t

Dá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
Citace
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

« Poslední změna: 09. 01. 2020, 14:40:25 od Pivotal »


Tak jinak. zkusím to zpřehlednit. Všichní asi znají příkaz/konstrukci  echo "${PROMENNA/najdi/nahrad}"
Zajímá mě, zda existuje syntaxe pro následující věci:  V příkladech je to jen znázorněné intuitivně, aby bylo vědět, co se od nich čeká, takový syntaxe neexistuje

1. Existuje něco na způsob  echo "${`ls`/najdi/nahrad}" (text nahrazuje ve výstupu příkazu místo proměnné)

2 Existuje něco na způsob  echo "${"zadaný text"/najdi/nahrad}" (text  je zadán přímo namísto proměnné)

3 Existuje něco na způsob  echo "${`PROMENNA/najdi/nahrad,,%%*([a-z])}" (řetězení operace substituce, převodu na malá písmenka a odstranění posledního "slova")
« Poslední změna: 11. 01. 2020, 21:01:58 od Pivotal »

Tá vlastnosť sa volá parameter expansion, pričom parameter je ekvivalent pojmu premenná.

Výraz za kučeravou zátvorkou musí byť premenná.

1. Toto nefunguje, lebo `ls` nie je názov premennej. Riešenie je priradiť výsledok príkazu do premennej a potom nahrádzať. Technická poznámka: výsledok príkazu `ls` nespracovávajte, to je skoro stále deravé.
2. Toto tiež nefunguje, lebo "zadaný text" nie je názov premennej. Detto priraďte do premennej.
3. Toto tiež nefunguje, expanzia parametrov je fakt jednoduchý mechanizmus a nie samostatný programovací jazyk. Ak sa to aj dá nejakou šialenou konštrukciou vyrobiť, málokto tomu porozumie. Urobte to na tri riadky.
Kód: [Vybrat]
DIR='public_html'
# prevod na 'private_html'
PRIVDIR="${DIR/public/private}"
# prevod na 'PRIVATE_HTML'
PRIVDIR_UPPER="${PRIVDIR^^[a-z]}"
# prevod na 'PRIVATE'
echo ${PRIVDIR_UPPER%_*}
Toto tu môžeme prehnať cez jeden GNU sed:
Kód: [Vybrat]
echo 'public_html' | sed -e 's/private/public/' -e 's/.*/\U&/' -e 's/_.*//'

Motto: když držíte v ruce kladivo, každý problém vypadá jako hřebík.

Ad 1:
Kód: [Vybrat]
for f in *; do echo "${f/najdi/nahrad}"; done
Ad 2:
Kód: [Vybrat]
date +%Y
Ad 3: Prostě to rozepište na jednotlivé transformace, stejně to tak bude mnohem čitelnější a přehlednější.