Eliminar la primera parte de una cadena usando sed

14

¿Cómo obtengo esto?

randomcollege-nt\user90

a esto:

user90

utilizando sed?

Roboman1723
fuente
2
Un consejo útil: cuando no esté seguro de lo que hace un comando, escriba man the_command_namey obtendrá un manual de instrucciones útil para el comando. También puede ir a www.google.com y escribir "tutorial de nombre de comando" y encontrará muchas guías paso a lado.
DBedrenko
2
Para ver un tutorial sobre la sedvisita: grymoire.com/Unix/Sed.html
Pandya

Respuestas:

15

Yo usaría un simple greppara buscar user90:

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

Si user90 no es constante, prefiera este comando:

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

Finalmente usando sedpara editar el archivo en su lugar:

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

O para hacer coincidir todas las cuentas de usuario posibles:

$ sed -ri 's/randomcollege-nt\\(\w+)/\1/' my_file
Sylvain Pineau
fuente
Lo curioso es que lo intenté y no volvió nada. Estoy usando 12.04 si eso importa. Solo aparece si tengo grep -Ftoda la cadena.
Roboman1723
@ Roboman1723 probado en 12.04, mis primeros comandos funcionan. Asegúrese de no tener un alias grep definido en alguna parte. Por cierto, como parece que estás buscando un reemplazo en línea con sed, he agregado dicho comando.
Sylvain Pineau
¿Hay alguna manera de que ese comando sed elimine todo "randomcollege-nt \" pero muestre más que solo el usuario 90? Ejemplo: randomcollege-nt \ user90 randomcollege-nt \ user91 randomcollege-nt \ user92 Salida: user90 user91 user92
Roboman1723
1
@ Roboman1723 Debe adjuntar su archivo original y el resultado deseado a su pregunta para que todos los que estén dispuestos a ayudarlo puedan verlo.
Sylvain Pineau
1
@SylvainPineau, creo que el primer comando no es apropiado.
Avinash Raj
20

Está analizando un texto para extraer el nombre de usuario de una domain\usernamecadena, muy probablemente de Windows. La mayoría de las respuestas anteriores solo abordan su cadena de ejemplo específica.

La mejor manera de hacer esto es usar regex en sed para extraer lo que venga después \. Así es como lo harías:

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

Eso coincidirá con todo ( .*) hasta una barra diagonal inversa (aquí, estamos escapando, así que es \\), luego coincidirá con todo después de la barra diagonal inversa ( .*), pero lo convertirá en un grupo de captura (es decir, se colocará entre corchetes alrededor, pero también tenemos que escapar ellos, entonces \(.*\)). Ahora que tenemos lo que viene después \de la cadena como un grupo de captura, lo imprimimos haciendo referencia a él \1.

Puede usar el sedcomando anterior con cualquier nombre de dominio, no necesariamente 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
fuente
10

Otro sed:

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

o POSIXY:

$ a='randomcollege-nt\user90'
$ printf '%s\n' "${a##*\\}"
user90
Cuonglm
fuente
1
No es un bashism, es una shcaracterística POSIX . pubs.opengroup.org/onlinepubs/009604599/utilities/…
nyuszika7h
+1. no vi su respuesta, eliminaré mi comentario sobre OP ^^
Olivier Dulac
9

Sé que quieres usar sed, pero yo usaría algo diferente ...

echo "randomcollege-nt\user90" | cut -d'\' -f2
Kervin
fuente
1
Saber cómo usar una herramienta es tan importante como saber qué herramienta usar.
Rafał Cieślak
5

¿Es esta la pregunta?

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

Si el sting randomcollege-nt no está en uso, use el comando awk arriba / abajo.

Archemar
fuente
1
cuando corro que consigo /user90nouser90
Roboman1723
2
No, está bien, tengo usuario90.
saptarshi nag
3

En su lugar, utiliza 'awk' para filtrar "user90":

echo "randomcollege-nt\user90" | awk -F\\ {'print $2'}
saptarshi nag
fuente
¿Son una forma con awk de editar el archivo en su lugar y no tener que enviarlo a un nuevo archivo?
Roboman1723
@ Roboman1723 ver stackoverflow.com/a/16531920/2072269
muru
Sí, debe usar la opción -f para awk. Para obtener más información, consulte la página de manual.
saptarshi nag
1

Este simple comando grep hará el trabajo,

$ echo 'randomcollege-nt\user90' | grep -oP '[^\\]*$'
user90
Avinash Raj
fuente
1


Con sedeliminar todo en una cadena antes de un carácter específico (definir en doble paréntesis [Carácter específico]).

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

Significa reemplazar todos los .*[\]caracteres ( ) antes de un \carácter con un espacio en blanco ( //)

Si tiene un archivo y desea reemplazarlo, use el -iindicador en sedcomando como este:

sed -i 's/.*[\]//' /path/to/FileName
αғsнιη
fuente
1

Se hizo la pregunta original sed, pero veo que las alternativas son populares aquí.

Si está utilizando Bash, la expansión de parámetros es, con mucho, la más simple:

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

Si potencialmente espera más de una barra invertida, duplique los signos hash:

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

Para obtener más información man bashy buscar Parameter Expansion.

Paddy Landau
fuente
0

En caso de que alguien esté tratando de eliminar un comentario # server_tokens off;de nginx automáticamente para ayudar con las operaciones de desarrollo automático:

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

Probado y funcionando para nginx / 1.12.1 en Ubuntu 16.04 LTS. Respuesta relacionada para bloquear NGINX desactivando los tokens del servidor aquí .

jamescampbell
fuente