GNU/Linux >> Znalost Linux >  >> Ubuntu

Bash:Regulární výrazy v substituci?

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

Ubuntu
  1. Představení regulárních výrazů

  2. Definice regulárního výrazu?

  3. Chyba skriptu Bash:Očekává se celočíselný výraz?

  1. Přidávat seznam hodnot do Bash skriptu?

  2. Bash + Ověřit název regulárním výrazem?

  3. 6 Bashových příkladů podmíněných výrazů ( -e, -eq, -z, !=, [, [[ ..)

  1. Proč `\d` nefunguje v regulárních výrazech v sed?

  2. Regulární výraz pro hledání dvojitých znaků v Bash

  3. Regulární výraz se sed