Mám bash skript pro nahrazení číselných hodnot uvnitř textového vzoru. Předpokládejme, že mám soubor jako tento:
word5word
word55word
A chci, aby to vypadalo takto:
word125word
word125word
Mám k tomu tento skript:
#!/bin/bash
re='([0-9]|[0-9][0-9])'
while read line
do
new_line=${line/"word"$re"word"/"word"125"word"}
echo "$new_line"
done < /home/tomak/test.txt
Z nějakého důvodu není výraz „re“ správně interpretován a vytiskne původní řádky. Jen nemůžu přijít na to proč. Funguje pro jednu číslici, tj. re='[0-9]'
.
K formulaci výrazu jsem použil informace z Bash Guide for Beginners, která uvádí, že:
Dva regulární výrazy mohou být spojeny infixovým operátorem „|“;
výsledný regulární výraz odpovídá jakémukoli řetězci odpovídajícímu
podvýrazu.
Ale na mě to prostě nefunguje. Co mi chybí?
Všimněte si, že jsem se pokusil nastavit shopt -s extglob
a formulujte výraz jako [0-9][0-9]?
ale ani to nefungovalo.
Jsem na Ubuntu 14.10 a mám verzi bash 4.3.30. Skript spouštím pomocí bash foo.sh
.
Přijatá odpověď:
Náhrada rozšíření parametrů nefunguje s regulárními výrazy. extglob
zde vám může pomoci, ale nefunguje ani s regulárními výrazy.
Správná syntaxe pro výraz pod extglob
je
re='+([0-9])'
tj. číslici jednou nebo vícekrát.
Test:
re='+([0-9])'
echo $'word5word\nword55word' | while read line ; do
new_line=${line/"word"$re"word"/"word"125"word"}
echo "$new_line"
done
Výstup:
word125word
word125word