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