GNU/Linux >> LINUX-Kenntnisse >  >> Ubuntu

Bash:Reguläre Ausdrücke als Ersatz?

Ich habe ein Bash-Skript, um Zahlenwerte in einem Textmuster zu ersetzen. Angenommen, ich habe eine Datei wie diese:

word5word
word55word

Und ich möchte, dass es so aussieht:

word125word
word125word

Ich habe dieses Skript, um das zu tun:

#!/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

Aus irgendeinem Grund wird der „re“-Ausdruck nicht richtig interpretiert und es werden die ursprünglichen Zeilen gedruckt. Ich kann einfach nicht herausfinden, warum. Es funktioniert für eine einzelne Ziffer, also re='[0-9]' .

Um den Ausdruck zu formulieren, habe ich Informationen aus dem Bash Guide for Beginners verwendet, die Folgendes besagen:

Zwei reguläre Ausdrücke können durch den Infix-Operator „|“ verbunden werden; Der
resultierende reguläre Ausdruck stimmt mit jeder Zeichenfolge überein, die mit einem der
Unterausdrücke übereinstimmt.

Aber es funktioniert einfach nicht für mich. Was übersehe ich?

Beachten Sie, dass ich versucht habe, shopt -s extglob festzulegen und formulieren Sie den Ausdruck wie [0-9][0-9]? aber das hat auch nicht funktioniert.

Ich bin auf Ubuntu 14.10 und habe die Stock-Bash-Version 4.3.30. Ich führe das Skript mit bash foo.sh aus .

Akzeptierte Antwort:

Die Substitution der Parametererweiterung funktioniert nicht mit regulären Ausdrücken. extglob kann dir hier helfen, funktioniert aber auch nicht mit regulären Ausdrücken.

Die korrekte Syntax für den Ausdruck unter extglob ist

re='+([0-9])'

d.h. eine Ziffer einmal oder mehrmals.

Test:

re='+([0-9])'
echo $'word5word\nword55word' | while read line ; do
    new_line=${line/"word"$re"word"/"word"125"word"}
    echo "$new_line"
done

Ausgabe:

word125word
word125word

Ubuntu
  1. Reguläre Ausdrücke einführen

  2. Zitieren innerhalb von $ (command Substitution) in Bash?

  3. Bash + Name durch regulären Ausdruck überprüfen?

  4. Warum funktioniert `\d` nicht in regulären Ausdrücken in sed?

  5. Linux GUI Regular Expression File Renamer (mit Substitution)

Erste Schritte mit regulären Ausdrücken

Bash-Sequenzausdruck (Bereich)

Reguläre Ausdrücke in Grep (Regex)

Eine Werteliste an ein Bash-Skript weiterleiten?

6 Beispiele für bedingte Bash-Ausdrücke ( -e, -eq, -z, !=, [, [[ ..)

grep Extraktnummernbereich