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.

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.


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}'

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


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'

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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.