wake-up-neo.com

Geben Sie einen Regex-Treffer in einem BASH-Skript zurück, anstatt ihn zu ersetzen

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
} 
20
Mint
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))
28

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]}"
32
John Kugelman

Pure Bash . Verwenden Sie die Parametersubstitution (keine externen Prozesse und Pipes):

string="TestT100String"

echo ${string//[^[:digit:]]/}

Entfernt alle Nicht-Ziffern. 

15
Fritz G. Mehner

Verwenden Sie grep. Sed ist ein Editor. Wenn Sie nur einen regulären Ausdruck abgleichen möchten, ist grep mehr als ausreichend.

6
Mic

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.

1
ToastStudios

mit awk

linux$ echo -E "TestT100String" | awk '{gsub(/[^0-9]/,"")}1'
100
1
ghostdog74

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
}
1
ephemient

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.

0
tomkaith13