2009-12-14 14 views
16

Po prostu chcę dopasować tekst w skrypcie BASH, próbowałem używać sed, ale nie wydaje mi się, żeby po prostu wyprowadzał dopasowanie zamiast zastąpienie go czymś.Zwróć dopasowanie regex w skrypcie BASH, zamiast go zastępować

echo -E "TestT100String" | sed 's/[0-9]+/dontReplace/g' 

Które wyjście: TestTdontReplaceString

Który nie jest to, co chcę, chcę go do wyjścia: 100

Idealnie byłoby chcę go umieścić wszystkie mecze w tablicy.

edit: wprowadzania tekstu nadchodzi w postaci ciągu:

newName() 
{ 
#Get input from function 
newNameTXT="$1" 

if [[ $newNameTXT ]]; then 
#Use code that im working on now, using the $newNameTXT string. 

fi 
} 

Odpowiedz

21
echo "TestT100String" | sed 's/[^0-9]*\([0-9]\+\).*/\1/' 

echo "TestT100String" | grep -o '[0-9]\+' 

Sposób korzystania umieścić wyniki w tablicy zależy w pewnym stopniu od sposobu pobierania rzeczywistych danych. Na Twoim pytaniu jest za mało informacji, aby móc Cię dobrze prowadzić. Jednak tutaj jest jedna metoda:

index=0 
while read -r line 
do 
    array[index++]=$(echo "$line" | grep -o '[0-9]\+') 
done < filename 

Oto kolejny sposób:

array=($(grep -o '[0-9]\+' filename)) 
+0

Dodano w metodzie wprowadzania w pierwotnym pytaniu. (jego dane wejściowe znajdują się na forum ciągów znaków). – Mint

5

Użyj grep. Sed jest redaktorem. Jeśli chcesz tylko dopasować wyrażenie regularne, grep jest więcej niż wystarczający.

+0

SED nie zapisuje do pliku źródłowego - jedynym sposobem, aby to się stało, jest zapisanie danych wyjściowych o tej samej nazwie pliku w celu nadpisania pliku. –

+0

To prawda, ale sed wciąż jest edytorem. Jego nazwa jest nawet krótka dla edytora strumieniowego. Jeśli potrzebuje tylko dopasować, może użyć grep. – Mic

+1

Nie sądzę, że chce się dopasować. Mówi, że potrzebuje 100 – ghostdog74

28

Można to zrobić wyłącznie w bash za pomocą podwójnego kwadratowy nawias [[ ]] operatora testowy, który przechowuje wyniki w tablicy o nazwie BASH_REMATCH:

[[ "TestT100String" =~ ([0-9]+) ]] && echo "${BASH_REMATCH[1]}" 
+1

Potrzeba prawdziwej małpy, aby to rozgryźć – Prospero

+1

Ale zobacz http://stackoverflow.com/questions/218156/bash-regex-with-quotes na problemy z cytowaniem bash w różnych wersjach BASH . –

0

Cóż, Sed z S/"WZÓR 1"/"pattern2"/g prostu zastępuje globalnie wszystkie pattern1s do wzorca 2.

Poza tym sed domyślnie drukuje cały wiersz domyślnie. sugeruję rurociągów dyspozycję polecenia Wytnij i próbuje wyodrębnić numery u chcą:

Jeśli u są patrząc tylko użyć sed następnie użyć TRE:

sed -n 's/.*\(0-9\)\(0-9\)\(0-9\).*/\1,\2,\3/g'. 

ja odczuwało spróbować wykonać powyższego polecenia więc upewnij się, że składnia jest właściwa. Mam nadzieję, że to pomogło.

1

za pomocą awk

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

używając tylko powłoka Bash

declare -a array 
i=0 
while read -r line 
do 
     case "$line" in 
      *TestT*String*) 
      while true 
      do 
       line=${line#*TestT} 
       array[$i]=${line%%String*} 
       line=${line#*String*} 
       i=$((i+1)) 
       case "$line" in 
        *TestT*String*) continue;; 
        *) break;; 
       esac 
      done 
      esac 
done <"file" 
echo ${array[@]} 
1

nie wiem dlaczego nikt nie korzysta expr: jest przenośny i łatwy.

newName() 
{ 
#Get input from function 
newNameTXT="$1" 

if num=`expr "$newNameTXT" : '[^0-9]*\([0-9]\+\)'`; then 
    echo "contains $num" 
fi 
} 
13

Czysta Bash. Użyj zastępowania parametrów (bez procesów zewnętrznych i rur):

string="TestT100String" 

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

Usuwa wszystkie niedifikki.

+1

To naprawdę powinno mieć więcej upwertowań. –

Powiązane problemy