Mam ciąg formatu [0-9]+\.[0-9]+\.[0-9]
. Muszę wyodrębnić pierwszą, drugą i trzecią liczbę osobno. Jak rozumiem, grupy przechwytywania powinny mieć taką możliwość. Powinienem być w stanie użyć sed "s/\([0-9]*\)/\1/g
pierwszego numeru, sed "s/\([0-9]*\)/\2/g
drugiego numeru i sed "s/\([0-9]*\)/\3/g
trzeciego numeru. Jednak w każdym przypadku otrzymuję cały ciąg. Dlaczego to się dzieje?
27
's/\([0-9]\)\([0-9]\)\([0-9]\).*/\1\2\3/'
uchwycić poszczególne liczby.Odpowiedzi:
Nie możemy dać ci pełnej odpowiedzi bez przykładu twojego wkładu, ale mogę powiedzieć, że twoje rozumienie grup przechwytywania jest błędne. Nie używasz ich sekwencyjnie, odnoszą się one tylko do wyrażenia regularnego po lewej stronie tego samego operatora podstawienia. Jeśli na przykład przechwycisz,
/(foo)(bar)(baz)/
wtedyfoo
będzie\1
,bar
będzie\2
ibaz
będzie\3
. Nie możesz tego zrobićs/(foo)/\1/; s/(bar)/\2/
, ponieważ w drugims///
połączeniu jest tylko jedna grupa przechwycona, więc\2
nie zostanie zdefiniowana.Aby przechwycić trzy grupy cyfr, musisz zrobić:
Lub, bardziej czytelny:
źródło
/(foo)/
w sed będzie pasować dosłowny(
znak, afoo
następnie literał)
. Jeśli chcesz przechwycić grupę, musisz uciec z nawiasów lub skorzystać z-E
opcji.-r
flagi, więc zakładam, że dlatego na to nie wpadłem.-r
flaga to zrobi, ale nie jest przenośna. GNU sed obsługuje to, ale wiele innych nie.-E
Jest bardziej uniwersalna.Przykład:
Lub wszystkie razem:
źródło
Użyj Sed z opcją -r, --regexp-Extended, aby uniknąć wszystkich nawiasów, których nie można uniknąć
źródło