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

14

Jak mogę to uzyskać:

randomcollege-nt\user90

do tego:

user90

używasz sed?

Roboman1723
źródło
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
Sylvain Pineau
źródło
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
Alaa Ali
źródło
10

Kolejny sed:

$ echo "randomcollege-nt\user90" | LC_ALL=C sed -e 's/.*\\//'
user90

lub POSIXly:

$ a='randomcollege-nt\user90'
$ printf '%s\n' "${a##*\\}"
user90
Cuonglm
źródło
1
To nie jest bashism, to shfunkcja POSIX . pubs.opengroup.org/onlinepubs/009604599/utilities/…
nyuszika7h
+1. nie widziałem twojej odpowiedzi, usunę mój komentarz do OP ^^
Olivier Dulac
9

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

echo "randomcollege-nt\user90" | cut -d'\' -f2
Kervin
źródło
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.

Archemar
źródło
1
kiedy biegnę, że mogę /user90nieuser90
Roboman1723
2
Nie, w porządku, mam użytkownika90.
saptarshi nag
3

Zamiast tego używasz „awk” do filtrowania „user90”:

echo "randomcollege-nt\user90" | awk -F\\ {'print $2'}
saptarshi nag
źródło
Czy są one sposobem awk na edycję pliku na miejscu i nie muszą go wysyłać do nowego pliku?
Roboman1723,
@ Roboman1723 patrz stackoverflow.com/a/16531920/2072269
muru
Tak, musisz użyć opcji -f, aby awk.Aby poznać szczegóły, patrz strona man.
saptarshi nag
1

To proste polecenie grep wykona zadanie,

$ echo 'randomcollege-nt\user90' | grep -oP '[^\\]*$'
user90
Avinash Raj
źródło
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
αғsнιη
źródło
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.

Paddy Landau
źródło
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 .

jamescampbell
źródło