Ich möchte nur etwas Text in einem BASH-Skript abgleichen, ich habe es mit sed versucht, aber ich kann nicht so aussehen, als würde ich nur das Match ausgeben, anstatt es durch etwas zu ersetzen.
echo -E "TestT100String" | sed 's/[0-9]+/dontReplace/g'
Was wird ausgegeben: TestTdontReplaceString
Welches ist nicht das, was ich will, ich möchte, dass es ausgegeben wird: 100
Im Idealfall möchte ich, dass alle Übereinstimmungen in ein Array eingefügt werden.
edit: Texteingabe kommt als Zeichenfolge:
newName()
{
#Get input from function
newNameTXT="$1"
if [[ $newNameTXT ]]; then
#Use code that im working on now, using the $newNameTXT string.
fi
}
echo "TestT100String" | sed 's/[^0-9]*\([0-9]\+\).*/\1/'
echo "TestT100String" | grep -o '[0-9]\+'
Die Methode, die Sie zum Einfügen der Ergebnisse in ein Array verwenden, hängt etwas davon ab, wie die tatsächlichen Daten abgerufen werden. Es gibt nicht genug Informationen in Ihrer Frage, um Sie gut leiten zu können. Hier ist jedoch eine Methode:
index=0
while read -r line
do
array[index++]=$(echo "$line" | grep -o '[0-9]\+')
done < filename
Hier ist ein anderer Weg:
array=($(grep -o '[0-9]\+' filename))
Sie können dies rein in der Bash mit dem doppelten eckigen Klammer [[ ]]
Testoperator tun, der die Ergebnisse in einem Array mit dem Namen BASH_REMATCH
speichert:
[[ "TestT100String" =~ ([0-9]+) ]] && echo "${BASH_REMATCH[1]}"
Pure Bash . Verwenden Sie die Parametersubstitution (keine externen Prozesse und Pipes):
string="TestT100String"
echo ${string//[^[:digit:]]/}
Entfernt alle Nicht-Ziffern.
Verwenden Sie grep. Sed ist ein Editor. Wenn Sie nur einen regulären Ausdruck abgleichen möchten, ist grep mehr als ausreichend.
Ich weiß, dass dies ein altes Thema ist, aber ich bin ihr auf die gleiche Suche gekommen und habe eine weitere großartige Möglichkeit gefunden, eine Regex mit grep auf einen String/eine Variable anzuwenden:
# Simple
$(echo "TestT100String" | grep -Po "[0-9]{3}")
# More complex using lookaround
$(echo "TestT100String" | grep -Po "(?i)TestT\K[0-9]{3}(?=String)")
Durch die Verwendung von Lookaround-Funktionen können Suchausdrücke für eine bessere Übereinstimmung erweitert werden. Wobei (?i)
Das Muster vor dem gesuchten Muster (Lookahead) angibt, \K
Das tatsächliche Suchmuster angibt und (?=)
Das Muster nach der Suche (Lookbehind) enthält.
https://www.regular-expressions.info/lookaround.html
Das angegebene Beispiel stimmt mit dem PCRE-regulären Ausdruck TestT([0-9]{3})String
überein.
mit awk
linux$ echo -E "TestT100String" | awk '{gsub(/[^0-9]/,"")}1'
100
Ich weiß nicht, warum niemand expr
benutzt: es ist tragbar und einfach.
newName()
{
#Get input from function
newNameTXT="$1"
if num=`expr "$newNameTXT" : '[^0-9]*\([0-9]\+\)'`; then
echo "contains $num"
fi
}
Nun, das Sed mit dem s/"pattern1"/"pattern2"/g ersetzt einfach global alle pattern1s zu pattern 2.
Ausserdem drucke sed, während standardmäßig die gesamte Zeile gedruckt wird. Ich schlage vor, die Anweisung an einen Ausschneidebefehl weiterzuleiten und zu versuchen, die gewünschten Zahlen zu extrahieren:
Wenn Sie nur nach sed suchen, verwenden Sie TRE:
sed -n 's/.*\(0-9\)\(0-9\)\(0-9\).*/\1,\2,\3/g'.
Ich versuche nicht, den obigen Befehl auszuführen, stellen Sie also sicher, dass die Syntax richtig ist.