Bash: Reguläre Ausdrücke als Substitution

Bash: Reguläre Ausdrücke als Substitution

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

Dafür habe ich folgendes 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

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

Zur Formulierung des Ausdrucks verwendete ich Informationen aus demBash-Handbuch für Anfängerdie besagt, dass:

Zwei reguläre Ausdrücke können durch den Infix-Operator „|“ verknüpft werden; der resultierende reguläre Ausdruck stimmt mit jeder Zeichenfolge überein, die einem der beiden Teilausdrücke entspricht.

Aber bei mir funktioniert es einfach nicht. Was übersehe ich?

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

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

Antwort1

Die Ersetzung der Parametererweiterung funktioniert nicht mit regulären Ausdrücken. extglobkann dir hier weiterhelfen, funktioniert aber auch nicht mit regulären Ausdrücken.

Die korrekte Syntax für den Ausdruck darunter extglobist

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

also eine Ziffer ein- oder mehrmals.

Prüfen:

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

Antwort2

Wenn Sie nur Muster ersetzen, schlage ich sed oder Perl statt Bash vor:

sed -e 's/word[0-9]\+word/word125word/g' /home/tomak/test.txt

oder

perl -pe 's/word\d+word/word125waord/g' /home/tomak/test.txt

verwandte Informationen