Usuń pierwszą część łańcucha za pomocą sed


14

Jak mogę to uzyskać:

randomcollege-nt\user90

do tego:

user90

używasz sed?


2
Pomocna wskazówka: jeśli nie jesteś pewien, co robi polecenie, wpisz je, man the_command_namea otrzymasz pomocną instrukcję obsługi polecenia. Możesz także przejść na stronę www.google.com i wpisać „samouczek nazwy polecenia”, a znajdziesz wiele szczegółowych instrukcji.
DBedrenko,

2
Samouczek na sedstronie: grymoire.com/Unix/Sed.html
Pandya

Odpowiedzi:


15

Użyłbym prostego grepwyszukiwania user90:

$ echo "randomcollege-nt\user90" | grep -o user90
user90

Jeśli użytkownik90 nie jest stały, preferuj to polecenie:

$ echo "randomcollege-nt\user90" | grep -oP '(?<=randomcollege-nt\\)\w+'
user90

Na koniec użyj seddo edycji pliku w miejscu:

$ sed -ri 's/randomcollege-nt\\(user[0-9]+)/\1/' my_file

Lub, aby dopasować wszystkie możliwe konta użytkowników:

$ sed -ri 's/randomcollege-nt\\(\w+)/\1/' my_file

Zabawne jest to, że próbowałem tego i nic nie wróciło. Używam 12.04, jeśli to ma znaczenie. Pokazuje się tylko, jeśli mam grep -Fcały ciąg.
Roboman1723,

@ Roboman1723 przetestowany 12.04, moje pierwsze polecenia działają. Upewnij się, że nie masz gdzieś zdefiniowanego aliasu grep. BTW, ponieważ wydaje się, że szukasz wbudowanego zamiennika z sedem, dodałem takie polecenie.
Sylvain Pineau

Czy istnieje sposób, w jaki można sprawić, aby polecenie sed wycięło wszystkie „randomcollege-nt \”, ale wyświetlało więcej niż tylko 90 użytkownika? Przykład: randomcollege-nt \ użytkownik90 randomcollege-nt \ użytkownik91 randomcollege-nt \ użytkownik92 Dane wyjściowe: użytkownik90 użytkownik91 użytkownik92
Roboman1723

1
@ Roboman1723 Powinieneś dołączyć swój oryginalny plik i pożądany wynik do pytania, aby wszyscy chętni do pomocy mogli go zobaczyć.
Sylvain Pineau

1
@SylvainPineau Myślę, że pierwsze polecenie nie jest właściwe.
Avinash Raj

20

Analizujesz jakiś tekst, aby wyodrębnić nazwę użytkownika z domain\usernameciągu, najprawdopodobniej z systemu Windows. Większość powyższych odpowiedzi dotyczy tylko określonego ciągu przykładowego.

Najlepszym sposobem na to jest użycie wyrażenia regularnego w sed, aby wyodrębnić to, co nastąpi później \. Oto jak to zrobiłbyś:

sed 's|.*\\\(.*\)|\1|'

To dopasuje wszystko ( .*) do ukośnika odwrotnego (tutaj uciekamy, więc to jest \\), a następnie dopasuje wszystko po ukośniku ( .*), ale czyni z niego grupę przechwytywania (tzn. Zawijaj nawiasy wokół niego, ale musimy również uciec im, więc \(.*\)). Teraz, gdy mamy coś, co następuje po \ciągu jako grupa przechwytywania, drukujemy to, odwołując się do niego \1.

Powyższego sedpolecenia można użyć z dowolną nazwą domeny, niekoniecznie randomcollege-nt.

$ echo "randomcollege-nt\user90" | sed 's|.*\\\(.*\)|\1|'
user90

$ echo "domain\username" | sed 's|.*\\\(.*\)|\1|'
username

$ echo "anydomainname\roboman1723" | sed 's|.*\\\(.*\)|\1|'
roboman1723


9

Wiem, że chcesz użyć sed, ale użyłbym czegoś innego ...

echo "randomcollege-nt\user90" | cut -d'\' -f2

1
Wiedząc, jak użyć narzędzia jest tak samo ważne jak wiedza która narzędzie do wykorzystania.
Rafał Cieślak

5

Czy to jest pytanie?

$ echo randomcollege-nt\user90| sed -e s,randomcollege-nt\,,
user90

jeśli żądło randomcollege-nt nie jest stałe, użyj komendy awk powyżej / poniżej.


1
kiedy biegnę, że mogę /user90nieuser90
Roboman1723

2
Nie, w porządku, mam użytkownika90.
saptarshi nag


1

To proste polecenie grep wykona zadanie,

$ echo 'randomcollege-nt\user90' | grep -oP '[^\\]*$'
user90

1


Z sed usunąć wszystko na sznurku przed określonym znaku (określić na podwójnym uchwycie [specyficzna char]).

echo "randomcollege-nt\user90" | sed 's/.*[\]//'

Oznacza zastąpienie wszystkich ( .*[\]) znaków przed a\ znak spacji ( //)

Jeśli masz plik i chcesz go zastąpić, użyj -iflagi w sedpoleceniu w następujący sposób:

sed -i 's/.*[\]//' /path/to/FileName

1

Zadano oryginalne pytanie sed , ale widzę, że tutaj są popularne alternatywy.

Jeśli używasz Bash, ekspansja parametrów jest zdecydowanie najprostsza:

ORIGIN='randomcollege-nt\user90'
echo "${ORIGIN#*\\}"

Jeśli potencjalnie oczekujesz więcej niż jednego ukośnika odwrotnego, podwój znaki skrótu:

echo "${ORIGIN##*\\}"

Aby uzyskać więcej informacji man bashi wyszukaj Parameter Expansion.


0

W przypadku, gdy ktoś próbuje automatycznie usunąć komentarz # server_tokens off;z nginx, aby pomóc w auto dev-ops:

sudo sed -ri 's/#\s(server_tokens off;)/\1/' /etc/nginx/nginx.conf.

Przetestowane i działające dla nginx / 1.12.1 na Ubuntu 16.04 LTS. Powiązana odpowiedź na zablokowanie NGINX przez wyłączenie tokenów serwera tutaj .

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.