2010-07-23 16 views
24

Jestem w skorupkach i mam ten ciąg: 12 BBQ ,45 rofl, 89 lolJak wyodrębnić wartość z ciągu za pomocą wyrażeń regularnych i powłoki?

Korzystanie z regexp: \d+ (?=rofl) chcę 45 wyniku.

Czy użycie polecenia regex do wyodrębniania danych z ciągu jest poprawne? Najlepsze, co zrobiłem, to podkreślenie wartości w edytorze regex online. W większości przypadków usuwa on wartość z mojego ciągu znaków.

Prowadzę dochodzenie w sprawie expr, ale dostaję tylko błędy składniowe.

Jak zdołam wyodrębnić 45 ze skryptu powłoki?

+1

Co narzędzie używasz, co powłoki używacie, jaki jest dokładny poleceń użyłeś i co to za błąd masz? – Abel

+0

IMHO w tym celu, używanie Regex jest całkowicie dopuszczalne. –

Odpowiedz

41

Można to zrobić w trybie perl GNU grep:

echo "12 BBQ ,45 rofl, 89 lol"|grep -P '\d+ (?=rofl)' -o 

-P oznacza Perl-styl i -o oznacza tylko mecz.

+0

Czy można uniknąć używania stylu Perla, ponieważ został usunięty z grep w OS X od Mountain Lion? – AlexKorovyansky

+0

Możliwe rozwiązanie alternatywne/obejście systemu OS X polega na użyciu gnu grep przez homebrew, http://www.heystephenwood.com/2013/09/install-gnu-grep-on-mac-osx.html. – AlexKorovyansky

+0

Mogę pobrać numer portu kontenerów doków: D z 'portem dokowania c62c1c7b9efb | grep -P '(\ d +) $' -o' –

8

Wygląda na to, że zadajesz wiele pytań. Aby odpowiedzieć:

  • Tak, to jest ok, aby wyodrębnić dane z ciągu znaków za pomocą wyrażeń regularnych, to co oni tam
  • wystąpią błędy, których jedna i co skorupę narzędzie używacie?
  • Można wyodrębnić numery łapiąc je w zdobywaniu nawiasach:

    .*(\d+) rofl.* 
    

    i korzystania $1 aby uzyskać ciąg out (.* jest dla „reszty przed i po tej samej linii)

z sed jako przykład, pomysł staje się to, aby wymienić wszystkie ciągi w pliku tylko liczby Dopasowanie:

sed -e 's/.*(\d+) rofl.*/$1/g' inputFileName > outputFileName 

czyli

echo "12 BBQ ,45 rofl, 89 lol" | sed -e 's/.*(\d+) rofl.*/$1/g' 
+0

Nie potrzebujesz żadnego z '. *' w twoim przykładzie. Potrzebujesz tylko tych na krawędziach, jeśli twoje regex jest zakotwiczone. Unanchored, będzie już pasować do dowolnego miejsca wewnątrz napisu. – Daenyth

+0

OP poprosił o wybranie tylko numeru, a nie o pomyślny mecz. Dodając ". *", Jest to prosty sposób na dopasowanie wszystkiego i zastąpienie go odpowiednimi nawiasami. Bez nich reszta struny pozostaje nienaruszona, co nie jest tym, o co się pytano (iiuc). A może coś przegapiłem? – Abel

+0

Woops, brakowało mi, że używasz "sed" do tego. Kontynuować. – Daenyth

-1

Można oczywiście wyodrębnić tę część łańcucha i jest to świetny sposób, aby zanalizować się dane. Składnia wyrażeń regularnych jest bardzo różna, więc musisz odwołać się do pliku pomocy dla wyrażenia regularnego, którego używasz. Można spróbować wyrażenia regularnego jak:

[0-9]+ *[a-zA-Z]+,([0-9]+) *[a-zA-Z]+,[0-9]+ *[a-zA-Z]+ 

Jeśli program regex można zrobić wymianę strun następnie wymienić cały ciąg znaków z wyniku, który chcesz i można łatwo korzystać z tego rezultatu.

Nie wspomniałeś, że używasz powłoki bash lub innej powłoki. Pomoże to uzyskać lepsze odpowiedzi, gdy poprosimy o pomoc.

6

Tak, na pewno można użyć wyrażeń regularnych do wyodrębnienia części ciągu znaków. Niestety różne smaki * nix i różne narzędzia używają nieco innych wariantów Regex.

Ten sed polecenie powinno działać na większości smaki (Testowane na OS/X i RedHat)

echo '12 BBQ ,45 rofl, 89 lol' | sed 's/^.*,\([0-9][0-9]*\).*$/\1/g' 
0

można używać powłoki (bash, na przykład)

$ string="12 BBQ ,45 rofl, 89 lol" 
$ echo ${string% rofl*} 
12 BBQ ,45 
$ string=${string% rofl*} 
$ echo ${string##*,} 
45 
-1

Można użyć rextract do wyodrębnij za pomocą wyrażenia regularnego i sformatuj wynik ponownie.

Przykład:

[$] echo "12 BBQ ,45 rofl, 89 lol" | ./rextract '[,]([\d]+) rofl' '${1}' 
45 
+4

Musisz dodać zastrzeżenie, jeśli biblioteka jest Twoją własnością (coś w stylu "Zastrzeżenie: stworzyłem tę bibliotekę"). A z Githuba wydaje się, że ta biblioteka/plik wykonywalny jest twoją własnością – Justin

Powiązane problemy