
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 extglob
Beachten 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. extglob
kann dir hier weiterhelfen, funktioniert aber auch nicht mit regulären Ausdrücken.
Die korrekte Syntax für den Ausdruck darunter extglob
ist
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