Fórum Root.cz
Hlavní témata => Vývoj => Téma založeno: Ħαℓ₸℮ℵ ␏⫢ ⦚ » 09. 01. 2020, 14:38:13
-
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 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
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
-
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")
-
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.
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:
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:
for f in *; do echo "${f/najdi/nahrad}"; done
Ad 2:
date +%Y
Ad 3: Prostě to rozepište na jednotlivé transformace, stejně to tak bude mnohem čitelnější a přehlednější.