Jak użyć Seda do zastąpienia wszystkich znaków przed dwukropkiem?

25

Jak zastąpić następujący ciąg

hd_ma_prod_customer_ro:*:123456789:john.doe

z Johnem Doe

Zasadniczo muszę poszukać ostatniego dwukropka (:) i usunąć wszystko przed i włącznie.

yihyoon
źródło

Odpowiedzi:

40

Zakładając, że masz na myśli to, że chcesz usunąć wszystko do ostatniego dwukropka i pozostawić john.doenienaruszone:

echo 'hd_ma_prod_customer_ro:*:123456789:john.doe' |
  sed 's/.*://'

Wyjaśnienie:

Pierwszy wiersz po prostu potokuje łańcuch testowy sedna przykład do celów.

Drugi to sedpodstawienie podstawowe . Część między pierwszą a drugą /jest wyrażeniem regularnym do wyszukania, a część między drugim a trzecim jest tym, co ma ją zastąpić (nic w tym przypadku, ponieważ usuwamy).

Dla wyrażenia regularnego .dopasowuje dowolny znak, *powtarza to dowolną liczbę razy (w tym zero) i :dopasowuje dwukropek. Tak skutecznie, po nim następuje dwukropek. Ponieważ .*może zawierać dwukropek, dopasowanie jest „zachłanne” i obejmuje wszystko do ostatniego jelita grubego.

Graeme
źródło
7
sed -r 's/:/\t/g' filename | awk -F'\t' '{print $4}'

Ja zastąpienie wszystkich wystąpień : o karcie , a następnie za pomocą awkwyodrębnić john.doe ciąg.

Jeśli nie masz pliku, możesz spróbować.

echo 'hd_ma_prod_customer_ro:*:123456789:john.doe' | sed -r 's/:/\t/g' | 
awk -F'\t' '{print $4}'

Zgodnie z komentarzami Graeme możemy użyć awkdo wydrukowania ostatniej kolumny samodzielnie, używając NFzmiennej awkjak poniżej.

echo 'hd_ma_prod_customer_ro:*:123456789:john.doe' | sed -r 's/:/\t/g' | awk -F'\t' '{print $NF}'

Włączenie komentarzy Graeme, aby pozbyć się niepotrzebnych sed

Polecenie można zmodyfikować jak poniżej.

echo 'hd_ma_prod_customer_ro:*:123456789:john.doe' | awk -F':' '{print $NF}'
Ramesh
źródło
1
Jeśli zamierzasz użyć awk, dlaczego po prostu nie zrobić awk -F:?
Graeme
@Graeme, nadal nie czuję się tak komfortowo awk. Zasadniczo próbuję przetestować polecenia, które pierwotnie otrzymałem w odpowiedzi i próbuję je zmodyfikować zgodnie z wymaganiami użytkownika. :)
Ramesh
3
-FOpcja awkokreśla separator pól. Jeśli zdecydujesz awksię użyć dwukropka, nie ma potrzeby zastępowania dwukropka tabulatorami. Ponadto, jeśli chcesz uzyskać ostatnie pole, którego możesz użyć $NFzamiast $4, działałoby to, jeśli nie zawsze są 3 dwukropki.
Graeme
@Graeme, wprowadziłem zmiany, o których wspomniałeś. Daj mi znać, jeśli jest w porządku :)
Ramesh
Tak, działa idealnie!
Graeme
6

Inna metoda wykorzystująca awk:

awk -F: '{ print $NF }'
Chris Down
źródło
2

Proszę spróbować

edycja: usunięto kotwicę

echo 'abc:fjk' |sed 's/.*:/john.doe/g'

i do usunięcia

echo 'abc:fjk' |sed 's/.*://g'
akash
źródło
nie o to prosi OP
iruvar
proszę ponownie przeczytać pytanie.
akash
Cóż, wkradłeś się do skasowania po moim komentarzu, nieważne
iruvar
rozumiem . przepraszam 1_CR
akash
1
^Kotwica ma znaczenia w przypadku, gdy którakolwiek Pytanie lub w Twojej przykładzie sprawy. Każdy adres zaczynający się od /.*implikuje ^.
mikeserv