Rimuovi la prima parte di una stringa usando sed


14

Come ottengo da questo:

randomcollege-nt\user90

a questo:

user90

usando sed?


2
Un consiglio utile: quando non sei sicuro di cosa faccia un comando, digita man the_command_namee otterrai un utile manuale di istruzioni per il comando. Puoi anche visitare il sito www.google.com e digitare "tutorial nome comando" e troverai molte guide dettagliate.
DBedrenko,

2
Per tutorial su sedvisita: grymoire.com/Unix/Sed.html
Pandya

Risposte:


15

Userei un semplice grepda cercare user90:

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

Se user90 non è costante, preferisci questo comando:

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

Infine usando sedper modificare il file in atto:

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

O per abbinare tutti i possibili account utente:

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

La cosa divertente è che l'ho provato e non è tornato nulla. Sto usando 12.04 se questo è importante. Si presenta solo se ho grep -Fl'intera stringa.
Roboman1723

@ Roboman1723 testato il 12.04, i miei primi comandi funzionano. Assicurati di non avere un alias grep definito da qualche parte. A proposito, sembra che tu stia cercando un sostituto in linea con sed. Ho aggiunto questo comando.
Sylvain Pineau,

C'è un modo in cui potresti fare in modo che il comando sed elimini tutto "randomcollege-nt \" ma visualizzi più di un semplice utente 90? Esempio: randomcollege-nt \ user90 randomcollege-nt \ user91 randomcollege-nt \ user92 Output: user90 user91 user92
Roboman1723

1
@ Roboman1723 Devi allegare il tuo file originale e l'output desiderato alla tua domanda in modo che tutti coloro che sono disposti ad aiutarti possano vederlo.
Sylvain Pineau,

1
@SylvainPineau penso che il primo comando non sia appropriato.
Avinash Raj,

20

Stai analizzando del testo per estrarre il nome utente da una domain\usernamestringa, molto probabilmente da Windows. La maggior parte delle risposte precedenti riguarda solo la stringa di esempio specifica.

Il modo migliore per farlo è usare regex in sed per estrarre tutto ciò che viene dopo \. Ecco come lo faresti:

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

Che corrisponderà a tutto ( .*) fino a una barra rovesciata (qui, stiamo sfuggendo, quindi è \\), quindi abbina tutto dopo la barra rovesciata ( .*), ma rendendolo un gruppo di acquisizione (ovvero avvolgendolo tra parentesi, ma dobbiamo anche scappare loro, quindi \(.*\)). Ora che abbiamo tutto ciò che segue \la stringa come gruppo di acquisizione, lo stampiamo facendo riferimento a \1.

È possibile utilizzare il sedcomando sopra con qualsiasi nome di dominio, non necessariamente 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

So che vuoi usare sed, ma userei qualcosa di diverso ...

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

1
Sapere come utilizzare uno strumento è altrettanto importante quanto sapere che strumento da utilizzare.
Rafał Cieślak,

5

È questa la domanda?

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

se la puntura randomcollege-nt non è contante utilizzare il comando awk sopra / sotto.


1
quando corro che ricevo /user90nonuser90
Roboman1723

2
No va bene, ho user90.
saptarshi nag,


1

Questo semplice comando grep farà il lavoro,

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

1


Con sedtutto ciò che di eliminazione in una stringa prima di un carattere specifico (definire in doppia staffa [char Specific]).

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

I mezzi sostituiscono tutti i .*[\]caratteri ( ) prima di un \carattere con carattere spazi bianchi ( //)

Se hai un file e vuoi sostituirlo, usa usa -iflag in sedquesto modo:

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

1

La domanda originale è stata posta sed, ma vedo che le alternative sono popolari qui.

Se stai usando Bash, l'espansione dei parametri è di gran lunga la più semplice:

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

Se ti aspetti potenzialmente più di una barra rovesciata, raddoppia i segni di hash:

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

Per ulteriori informazioni man bashe cercare Parameter Expansion.


0

Nel caso in cui qualcuno stia cercando di rimuovere automaticamente un commento # server_tokens off;da nginx per aiutare con le auto-dev-op:

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

Testato e funzionante per nginx / 1.12.1 su Ubuntu 16.04 LTS. Risposta correlata al blocco di NGINX disattivando i token del server qui .

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.