2012-05-14 20 views
5

Mam ciąg, który wygląda tak:Bash - wyodrębnić numery z łańcucha

„abcderwer 123123 10200 asdfasdf iopjjop”

Teraz chcę wyodrębnić numery, po xx schemacie, xxx, gdzie x jest liczba między 0-9. Na przykład. 10 200. Musi być pięciocyfrowy i musi zawierać ",".

Jak mogę to zrobić?

Dziękuję

Odpowiedz

9

Można użyć grep:

$ echo "abcderwer 123123 10,200 asdfasdf iopjjop" | egrep -o '[0-9]{2},[0-9]{3}' 
10,200 
+0

świetna odpowiedź, dziękuję – user1360250

1

Wyjazd pasujące do wzorca i wyrażenia regularne.

Odnośniki:

Bash regular expressions

Patterns and pattern matching

SO question

jak wspomniano powyżej, jednym sposobem wykorzystania dopasowanie wzór z grep. Inne zastosowania: echo obsługuje wzorce (globbing) i znajduje obsługiwane wyrażenia regularne.

+1

'echo' does not i' find' nie ma zastosowania do pytania. –

+0

@DennisWilliamson Nigdy nie powiedziałem, że są. I możesz użyć wzorów z echo. Przykład: echo * ocu? Ent? zwróci "Dokumenty", jeśli jesteś w zwykłym folderze domowym. Rozumiem, że chodziło ci o wyrecytowanie, edytuję to :) – keyser

+0

To nie jest regex, to globbing. –

0

Proste dopasowanie do wzorca (wzory globalne) jest wbudowane w powłokę. Zakładając, że masz za sznurki w $* (to znaczy, że są argumenty wiersza polecenia do skryptu, lub użyłeś set na sznurku zostały uzyskane w inny sposób), spróbuj tego:

for token; do 
    case $token in 
    [0-9][0-9],[0-9][0-9][0-9]) echo "$token" ;; 
    esac 
done 
+1

To byłoby '$ @'. Jest różnica. –

+0

Gdy uzyskujesz dostęp do wiersza poleceń, z pewnością istnieje różnica między '$ *' i '$ @'; ale w szczególności zdecydowałem się nazywać zmienną, która zawiera tablicę 'argv' przez jej oryginalną nazwę Bourne'a, ponieważ jest to nazwa używana w wielu ekspozycjach na poziomie początkującym; iw tym kontekście, gdy chcesz, aby wartości zostały podzielone na tokeny oddzielone spacjami, użyłby tego skrypt.Zgadzam się, że jeśli musisz odnieść się do parametrów pozycyjnych bezpośrednio w skrypcie, '' $ @ "' jest prawie zawsze tym, czego potrzebujesz. – tripleee

+0

Z, na przykład, 'set - 'abc def' ghi',' dla arg in "$ @"; wykonaj echo "$ arg"; done' robi właściwą rzecz. Te rzadko robią dobrze: '$ *' lub '" $ * "' (rzadko = tylko wtedy, gdy chcesz spłaszczyć argumenty). Nie ma sensu powtarzanie kolejnych wykładów na poziomie początkującym, które są błędne. –

0

Poniższy przykład za pomocą swojego ciąg danych wejściowych powinien rozwiązać problem za pomocą sed.

$ echo abcderwer 123123 10,200 asdfasdf iopjjop | sed -ne 's/^.*\([0-9,]\{6\}\).*$/\1/p' 
10,200 
4

W czystej Basha:

pattern='([[:digit:]]{2},[[:digit:]]{3})' 
[[ $string =~ $pattern ]] 
echo "${BASH_REMATCH[1]}" 
0

Nieco nietypowych rozwiązań.

< input tr -cd [0-9,\ ] | tr \ '\012' | grep '^..,...$' 

(Pierwszy tr usuwa wszystko oprócz przecinkami przestrzeni i cyfr, na sekund TR zastępuje spacje nowymi liniami, umieszczając każdy "numer" na oddzielnej linii , a grep odrzuca wszystko oprócz tych, które pasują do twojego kryterium.)